Git yapılandırması birden çok depoda ayarlanabilir mi?


18

Git, yapılandırma değerlerini üç düzeyde destekliyor gibi görünüyor:

  • Sistem başına global ayarlar (içinde saklanır /etc/git-core)
  • Kullanıcı başına global ayarlar (içinde saklanır ~/.gitconfig)
  • Havuz başına yerel ayarlar (içinde saklanır $REPO/.git/config)

Bu seçenekler temelin çoğunu kapsıyor, ancak dördüncü seviyeyi ele almanın bir yolunu arıyorum. Ben user.emailher zamankinden farklı bir değer kullanmanız gereken büyük (çok) depo koleksiyonum var . Bu depolar genellikle otomatik komut dosyaları aracılığıyla oluşturulur ve manipüle edilir ve havuz yerel ayarlarına göre kurulum zahmetlidir.

Söz konusu tüm depolar, yerel sistemimdeki belirli bir yol önekinin altında bulunur. Bu yol altındaki tüm depolar tarafından devralınacak bir yerde bir yapılandırma değeri ayarlamanın bir yolu var mı? (Benzer .htaccessayarlar dosya sistemini tamamen devralır.) Belki de genel yapılandırma dosyasında koşullu değerleri ayarlamanın bir yolu olabilir mi? UNIX ortamında benim gibi bir dizi havuzla başa çıkmak için başka ne gibi düzenlemeler yapılabilir?


İlk refleksim, .gitconfigoluşturdukları her dizinde ince ayar yapmak için komut dosyalarını kesmek . Örneğin, IIRC Android repo bunu yapabilir, ancak öğrenmek için kaynağı dikkatlice okumalısınız. (Tam olarak emin değilim, bunu bir süredir yapmadım.)
Gilles 'SO- kötü olmayı bırak'

@Gilles: Bu kesinlikle bir olasılık. Söz konusu depolar, yakın zamanda CVS'den Git'e taşınan bir Linux dağıtımının paket deposudur. Hala tüm takımlarımızı yeniden yapmaya çalışıyoruz. Uzun vadede muhtemelen bunun düzeltildiği yer burası, ancak kısa vadede üzerinde çalışanlarımız seçeneklerin ne olduğunu deniyorlar.
Caleb

Yanıtlar:


11

Git'i bu dördüncü seviyede yapılandırmanın bir yolunu bulamadım. Tek yol komut başına yapılandırma değeri geçersiz kılmalar gibi görünüyor git -c key=value.

Şu anki hacky çözümüm git için sarıcı görevi gören bir kabuk işlevi tanımlamak. Çağrıldığında, argümanları sistem git komutuna iletir, ancak mevcut çalışma dizinini denetlemeden ve varsa komuta fazladan bir argüman eklemeden önce değil.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

yapabilir miyim command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"ya da bunu nasıl yapmalıyım? Yüksek ve düşük aradı ve bulduğum bu -c bayrağı için tek referans senin, teşekkürler, çok takdir edildi.
Vic Goldfeld

kayıt için, çalıştımcommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
Vic Goldfeld


2

Git yapılandırmasına dayanan çözüme bakın:

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

“~ / .Gitconfig” dosyasına ekleyin:

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

İçeriğe sahip “~ / .gitconfig-project1 ″ dosyası oluşturun:

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

    [user]  
      name = user1  
      email = user1@email.com  

"includeIf" yüklem baş ağrımı kaydeder!
Truong Nguyen

1

Caleb'in cevabına dayanarak, gitbu dizindeki tüm depoları kalıcı olarak doğru şekilde yapılandıran değiştirilmiş bir komut tanımlayabiliriz , böylece vanilla git'in gelecekteki tüm kullanımları yeni yapılandırmayı kullanacaktır. Ben hubbaşka bir git sarıcı olan kullanın , bu yüzden benim alias git=hubile bunun yerine ve hubbenim işlev çağırdı - eğer kullanmıyorsanız hub, tüm hubçağrıları ile değiştirin 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
}

Caleb'in yalnızca bir kabukta (ve açıkça kaynaklanmadığı sürece, yalnızca etkileşimli bir kabukta) çalışan cevabından farklı olarak, bu, emacs magit gibi git yapılandırmasını doğru şekilde okuyan diğer git ön uçlarını da etkiler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.