Apakah mungkin untuk memiliki konfigurasi Git yang berbeda untuk proyek yang berbeda?


315

.gitconfigbiasanya disimpan dalam user.homedirektori.

Saya menggunakan identitas yang berbeda untuk mengerjakan proyek untuk Perusahaan A dan sesuatu yang lain untuk Perusahaan B (terutama nama / email). Bagaimana saya bisa memiliki dua konfigurasi Git yang berbeda sehingga check-in saya tidak sesuai dengan nama / email?

Jawaban:


264

The .git/configfile dalam klon tertentu repositori lokal untuk clone itu. Pengaturan apa pun yang ditempatkan di sana hanya akan memengaruhi tindakan untuk proyek tertentu itu.

(Secara default, git configmemodifikasi .git/config, tidak ~/.gitconfig- hanya dengan --globalapakah itu memodifikasi yang terakhir.)


jadi akankah memodifikasi file konfigurasi dalam konfigurasi untuk repo itu sendiri, misalnya mengubah [user] email = ...blok, akan menimpa global ~/.gitconfig- dan ini hanya untuk pengguna Anda?
dcsan

285

Ada 3 level konfigurasi git; proyek, global dan sistem.

  • proyek : Konfigurasi proyek hanya tersedia untuk proyek saat ini dan disimpan dalam .git / config di direktori proyek.
  • global : Konfigurasi global tersedia untuk semua proyek untuk pengguna saat ini dan disimpan di ~ / .gitconfig.
  • sistem : Konfigurasi sistem tersedia untuk semua pengguna / proyek dan disimpan di / etc / gitconfig.

Buat konfigurasi khusus proyek, Anda harus menjalankan ini di bawah direktori proyek:

$ git config user.name "John Doe" 

Buat konfigurasi global:

$ git config --global user.name "John Doe"

Buat konfigurasi sistem:

$ git config --system user.name "John Doe" 

Dan seperti yang Anda duga, project menimpa sistem global dan global.


69
Apakah ada kemungkinan untuk membuat konfigurasi "direktori"? Saya melakukan beberapa pekerjaan di rumah dan mendapat folder dengan proyek kerja dan saya sendiri. Jadi saya mendapat folder ~ / job dan ~ / my dengan git repos dan ingin konfigurasi yang berbeda untuk proyek di bawahnya. Misalnya job / project1 memiliki konfigurasi dari job / .gitconfig.
Serge

2
@Serge Apakah Anda pernah mencari tahu apakah mungkin untuk membuat konfigurasi level direktori? Saya memiliki masalah yang sama sekarang.
Mempertanyakan

2
Tidak, saya mengatur konfigurasi sistem secara keseluruhan untuk data pribadi dan membuat skrip bash untuk mengatur data pekerjaan ke konfigurasi proyek tertentu dalam satu perintah.
Serge

1
Sebagai tambahan: hanya git config user.nameatau git config user.emailakan menunjukkan kepada Anda nama atau email yang akan digunakan Git untuk tempat penyimpanan saat ini.
Abhishek Divekar

1
Saya akhirnya melakukan ini untuk zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , saya harap ini membantu seseorang.
pgarciacamou

219

Pada git versi 2.13, git mendukung konfigurasi bersyarat termasuk . Dalam contoh ini kita mengkloning repo Perusahaan A di ~/company_adirektori, dan repo Perusahaan B di ~/company_b.

Di Anda, .gitconfigAnda dapat menempatkan sesuatu seperti ini.

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

Contoh konten .gitconfig-company_a

[user]
name = John Smith
email = john.smith@companya.net

Contoh konten .gitconfig-company_b

[user]
name = John Smith
email = js@companyb.com

1
Sangat menyenangkan melihat ini telah ditambahkan di versi 2.13. Saya telah menggunakan github.com/bddenhartog/git-profiles untuk sementara, tetapi tidak bisa membuatnya bekerja dengan Tower.
Adrum

4
includeIf sedikit rewel, lihat: stackoverflow.com/questions/43919191/…
ruble

Halaman dokumentasi yang Anda tautkan tidak menyebutkan ini ... pada kenyataannya, mencari includeIf tidak menghasilkan apa pun dalam dokumentasi
Thomas Levesque

1
@ThomasLevesque Aneh. Saya yakin itu mengatakan sesuatu tentang itu sebelumnya. Anda dapat menemukannya di changelog github.com/git/git/blob/master/Documentation/RelNotes/… dan juga di kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@ JosephLust Anda perlu menginstal git> = 2.13 (Ubuntu 16.04 memiliki git 2.7) . Dapatkan versi terbaru git melalui Git PPA dan itu akan berhasil :)
Cas

24

Terima kasih @ crea1

Varian kecil:

Seperti yang tertulis di https://git-scm.com/docs/git-config#_includes :

Jika polanya berakhir dengan /, **akan ditambahkan secara otomatis. Misalnya, polanya foo/menjadi foo/**. Dengan kata lain, itu cocok foodan semua yang ada di dalamnya, secara rekursif.

Jadi saya gunakan dalam kasus saya,
~ / .gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

Jadi, jika direktori proyek ada di saya ~/wokspace/, pengaturan pengguna default diganti dengan
~ / .gitconfig-w :

[user]
name = John Smith
email = js@company.com

Selesai ini, sekarang nama pengguna dan email yang benar diatur di direktori yang berbeda. Ketika saya melakukan git config user.name / git config user.email saya mendapatkan rincian yang benar. Tetapi ketika saya berkomentar dalam repo pribadi, ia selalu menerima email nama pengguna resmi global
Bhupendra

@ Bhupendra Dalam sampel saya, .gitconfig dan .gitconfig-job ada di rumah saya, bukan di direktori proyek. Apakah Anda memerlukan lebih dari dua? Sudahkah Anda membuat .gitconfig-alternativ di direktori home Anda, sebagai .gitconfig-job saya dalam sampel saya, dengan 3 baris.
bcag2

@ bcag2 Saya juga mengikuti contoh yang sama seperti yang diberikan di atas. Saya memiliki 2 konfigurasi yang berfungsi default dan pribadi yang mirip dengan gitconfig-job. Ketika saya berada di direktori pribadi, pada user.name git config memberi saya nama yang benar tetapi untuk mendorong komit itu mengambil yang default sedangkan saya membutuhkan yang pribadi.
swapnil2993

@ swapnil2993 pertama saya pikir masalah jalur tetapi jika git config user.namekembali yang benar, itu harus ok. Apakah Anda di bawah GNU / Linux atau OS lainnya?
bcag2

@ bcag2 Mengatasi masalah. Hanya memperbaiki jalannya. Tapi git config user.name mengembalikan nilai yang benar itu aneh. Terima kasih atas jawabannya.
swapnil2993

14

Secara eksplisit, Anda juga dapat menggunakan --localuntuk menggunakan file konfigurasi repositori saat ini :

git config --local user.name "John Doe" 

12

Anda juga bisa mengarahkan variabel lingkungan GIT_CONFIGke file yang git configharus digunakan. Dengan GIT_CONFIG=~/.gitconfig-A git config key valuefile yang ditentukan akan dimanipulasi.


2
Keren; dengan sedikit sihir shell pintar ini dapat digunakan untuk mengatur semuanya jadi git mengambil gitconfig pertama yang ditemukan ketika melintasi pohon dir di atas repo saat ini. Terima kasih!
ecmanaut

1
Apakah Anda memiliki tautan ke shell ajaib ini yang melakukan ini? Kedengarannya bermanfaat!
pchiusano

1
@pchiusano di sini adalah versi yang belum sempurna dalam fish github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root

Terima kasih atas solusi sederhana yang hanya membutuhkan perubahan satu variabel lingkungan.
Noah Sussman

itu hanya memengaruhi perintah git config sekarang github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

12

Saya melakukan ini untuk email saya dengan cara berikut:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

Kemudian ketika saya mengkloning proyek kerja baru, saya hanya perlu menjalankan git hobbyprofiledan itu akan dikonfigurasi untuk menggunakan email itu.


3

Cara lain adalah dengan menggunakan direnv dan untuk memisahkan file konfigurasi per direktori. Sebagai contoh:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

Masing .envrc- masing harus berisi sesuatu seperti ini:

export GIT_CONFIG=$(pwd)/.gitconfig

Dan .gitconfiggitconfig biasa dengan nilai yang diinginkan.


2

Anda dapat menyesuaikan konfigurasi Git proyek dengan mengubah file konfigurasi khusus repositori (yaitu /path/to/repo/.git/config). BTW, git configmenulis ke file ini secara default:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

Saya lebih suka membuat profil terpisah untuk proyek yang berbeda (misalnya dalam ~/.gitconfig.d/) dan kemudian memasukkannya dalam file konfigurasi repositori:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

Ini bekerja dengan baik jika Anda perlu menggunakan set opsi yang sama dalam beberapa repo yang dimiliki oleh satu proyek. Anda juga dapat mengatur alias shell atau perintah Git khusus untuk memanipulasi profil.


0

Saya di kapal yang sama. Saya menulis skrip bash kecil untuk mengelolanya. https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

Skrip Anda di sini ada di Bash, sedangkan di Github Anda memiliki versi Python. Juga -stidak ditangani dalam skrip Bash Anda.
Vadim Kotov

0

Saya mengalami kesalahan saat mencoba git stashperubahan lokal saya. Kesalahan dari git mengatakan "Tolong beritahu saya siapa Anda" dan kemudian katakan kepada saya untuk "Jalankan git config --global user.email "you@example.comdan git config --global user.name "Your name"untuk menetapkan identitas default akun Anda." Namun, Anda harus Abaikan --global untuk mengatur identitas hanya di repositori Anda saat ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.