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?


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
}

dapat saya lakukan command git -c user.email=alternate@credentials.org 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 user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld



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.

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.