Dapatkah konfigurasi git diatur di beberapa repositori?

18

Git tampaknya mendukung nilai konfigurasi pada tiga level:

  • Pengaturan global per sistem (disimpan di /etc/git-core)
  • Pengaturan global per pengguna (disimpan di ~/.gitconfig)
  • Pengaturan lokal per-repositori (disimpan di $REPO/.git/config)

Opsi-opsi ini mencakup sebagian besar dasar tetapi saya sedang mencari cara untuk menangani tingkat keempat. Saya memiliki koleksi repositori (sangat) besar yang saya perlukan untuk menggunakan nilai yang berbeda user.emaildari biasanya. Repositori ini sering dibuat dan dimanipulasi melalui skrip otomatis, dan pengaturan per pengaturan lokal repositori rumit.

Semua repositori yang dimaksud berada di bawah awalan jalur tertentu pada sistem lokal saya. Apakah ada cara untuk menetapkan nilai konfigurasi di suatu tempat yang akan diwarisi oleh semua repositori di bawah jalur itu? (Semacam .htaccesspengaturan suka mewarisi sepanjang sistem file.) Mungkin akan ada cara untuk menetapkan nilai bersyarat dalam file konfigurasi global? Pengaturan apa lagi yang dapat dibuat dalam lingkungan UNIX untuk mengatasi satu set repositori seperti milik saya?

Caleb
sumber
Refleks pertama saya adalah meretas skrip untuk mengubah .gitconfigdi setiap direktori yang mereka buat. Sebagai contoh, repo IIRC Android dapat melakukan ini, tetapi Anda harus membaca sumbernya dengan hati-hati untuk mengetahuinya. (Aku tidak sepenuhnya yakin, aku belum melakukan itu dalam beberapa saat.)
Gilles 'SO- stop being evil'
@Gilles: Itu tentu saja kemungkinan. Repo yang dimaksud adalah repositori paket untuk distro Linux yang baru saja bermigrasi dari CVS ke Git. Kami masih berusaha memperbaiki semua alat kami. Dalam jangka panjang itu mungkin di mana ini diperbaiki, tetapi dalam jangka pendek kita yang bekerja di atasnya sedang bereksperimen dengan apa opsi tersebut.
Caleb

Jawaban:

11

Saya tidak menemukan cara untuk mengkonfigurasi git di level keempat ini. Satu-satunya cara tampaknya menimpa menggunakan nilai konfigurasi per-perintah git -c key=value.

Solusi hacky saya saat ini adalah mendefinisikan fungsi shell yang berfungsi sebagai pembungkus untuk git. Ketika dipanggil, ia meneruskan argumen ke perintah sistem git, tetapi tidak sebelum memeriksa direktori yang berfungsi dan menambahkan argumen tambahan ke perintah jika berlaku.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Caleb
sumber
dapat saya lakukan command git -c [email protected] user.name="Alter Ego" "$@"atau bagaimana saya harus melakukannya? Mencari tinggi & rendah dan satu-satunya referensi untuk bendera -c ini yang saya temukan adalah milik Anda, terima kasih, sangat dihargai.
Vic Goldfeld
sebagai catatan, saya berhasil bekerja dengancommand git -c [email protected] -c user.name="Alter Ego" "$@"
Vic Goldfeld
6

Anda dapat mengonfigurasi alamat email untuk git dengan variabel lingkungan GIT_AUTHOR_EMAIL. Jika Anda menggabungkan ini dengan Execute bash scripts pada memasukkan direktori atau konfigurasi shell spesifik direktori dengan zsh Anda dapat dengan mudah mengubah pengaturan per direktori atau direktori induk, misalnya jika Anda masuk ke direktori di dalam ~/workAnda dapat secara otomatis menyesuaikan variabel lingkungan untuk mengubah email Anda alamat.

Ulrich Dangel
sumber
2

Lihat solusinya berdasarkan konfigurasi git:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositor//

Tambahkan ke file “~ / .gitconfig”:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

Buat file “~ / .gitconfig-project1 ″ dengan konten:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  
gik
sumber
Predikat "includeIf" menghemat sakit kepala saya!
Truong Nguyen
1

Berdasarkan jawaban Caleb, kita dapat mendefinisikan gitperintah yang dimodifikasi yang secara permanen mengkonfigurasi semua repositori dalam direktori ini dengan benar, sehingga semua penggunaan vanilla git di masa depan akan menggunakan konfigurasi baru. Saya menggunakan hub, yang merupakan pembungkus git lain, jadi saya mengganti saya alias git=hubdengan ini dan memanggil hubfungsi saya - jika Anda tidak menggunakan hub, ganti semua hubdoa dengan command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

Tidak seperti jawaban Caleb, yang hanya bekerja di shell (dan kecuali bersumber secara eksplisit, hanya di shell interaktif), ini juga mempengaruhi ujung depan git lain yang membaca dengan benar konfigurasi git, seperti emacs magit.

Robin Green
sumber