Farklı projeler için farklı Git yapılandırması olması mümkün müdür?


315

.gitconfiggenellikle user.homedizinde saklanır .

A Şirketi için projeler ve B Şirketi için başka bir şey (öncelikle ad / e-posta) üzerinde çalışmak için farklı bir kimlik kullanıyorum. Check-in'lerimin ad / e-posta ile gitmemesi için iki farklı Git yapılandırmasına nasıl sahip olabilirim?

Yanıtlar:


264

.git/configBir depo belirli bir klon dosya o klon için yerel. Buraya yerleştirilen ayarlar yalnızca söz konusu proje için yapılacak işlemleri etkiler.

(Varsayılan olarak, git configdeğiştirir .git/config, değil ~/.gitconfig- sadece birlikte --globalyapar o ikincisi değiştirin.)


bu nedenle repo'nun config içindeki config dosyasını değiştirmek, örneğin [user] email = ...bloğu değiştirmek global ~/.gitconfigolanı geçersiz kılar - ve bu sadece sizin için mi?
dcsan

284

3 git konfig seviyesi vardır; proje, küresel ve sistem.

  • proje : Proje yapılandırmaları yalnızca geçerli proje için kullanılabilir ve proje dizinindeki .git / config dizininde saklanır.
  • global : Global yapılandırmalar, geçerli kullanıcının tüm projeleri için kullanılabilir ve ~ / .gitconfig içinde saklanır.
  • sistem : Sistem yapılandırmaları tüm kullanıcılar / projeler için kullanılabilir ve / etc / gitconfig içinde saklanır.

Projeye özgü bir yapılandırma oluşturun, bunu projenin dizini altında yürütmeniz gerekir:

$ git config user.name "John Doe" 

Genel bir yapılandırma oluşturun:

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

Bir sistem yapılandırması oluşturun:

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

Tahmin edebileceğiniz gibi, proje küresel ve küresel geçersiz kılma sistemini geçersiz kılar.


69
Bazı "dizin" yapılandırması yapma imkanı var mı? Evde bir iş yapıyorum ve iş projeleriyle ve kendi projelerimle klasörlerim var. Bu yüzden git repos ile ~ / job ve ~ / my klasörleri var ve altındaki projeler için farklı yapılandırmalar istiyorum. Örneğin, job / project1, job / .gitconfig dizininden yapılandırmaya sahiptir.
Serge

2
@Sizin bir dizin düzeyinde yapılandırma oluşturmanın mümkün olup olmadığını hiç anladınız mı? Şimdi aynı sorunu yaşıyorum.
Sorgulayan

2
Hayır Genel sistem yapılandırmasını kişisel verilere ayarladım ve iş verilerini tek bir komutta belirli proje yapılandırmalarına ayarlamak için bash betiği hazırladım.
Serge

1
Zeyilname gibi: Sadece git config user.nameveya git config user.emailsize adını gösterir veya Git akım respository kullanacağı e-posta göndereceğiz.
Abhishek Divekar

1
Sonunda bunu yaptım zsh için yaptım : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , umarım bu birine yardımcı olur.
pgarciacamou

219

Git sürüm 2.13 itibariyle, git koşullu yapılandırmayı destekler . Bu örnekte A Şirketinin depolarını ~/company_adizinde ve B Şirketinin depolarını kopyaladık ~/company_b.

Gözlerinde farklı .gitconfigböyle bir şey koyabilirsiniz.

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

.Gitconfig-company_a örnek içerikleri

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

.Gitconfig-company_b örnek içerikleri

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

1
Bunun 2.13 sürümüne eklendiğini görmek harika. Bir süredir github.com/bddenhartog/git-profiles kullanıyorum , ancak Tower ile çalışamadım.
adrum

4
includeIf biraz titiz ise, bkz: stackoverflow.com/questions/43919191/…
ruble

Bağlantı verdiğiniz dokümantasyon sayfası bundan bahsetmiyor ... aslında, includeIf araması dokümantasyonda herhangi bir sonuç vermez
Thomas Levesque

1
@ThomasLevesque Bu çok garip. Eminim daha önce bu konuda bir şeyler söyledi. Bunu changelog ggitub.com/git/git/blob/master/Documentation/RelNotes/… adresinde ve kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust git> = 2.13 yüklemeniz gerekir (Ubuntu 16.04 git 2.7'ye sahiptir) . Git PPA ile git'in en son sürümünü edinin ve işe yarayacak :)
Cas

24

Teşekkürler @ crea1

Küçük bir varyant:

Https://git-scm.com/docs/git-config#_incincinde yazıldığı gibi :

Desen ile biterse /, **otomatik olarak eklenir. Örneğin, desen foo/olur foo/**. Başka bir deyişle foo, özyinelemeyle eşleşir ve içerideki her şey.

Bu yüzden benim durumumda
~ / .gitconfig kullanıyorum :

[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…

Proje dizini benim ise ~/wokspace/, varsayılan kullanıcı ayarları
~ / .gitconfig-w ile değiştirilir :

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

Bunu yaptığınızda, şimdi doğru kullanıcı adı ve e-posta farklı dizinlerde ayarlanmış. Git config user.name / git config user.email yaptığımda doğru bilgileri alıyorum. Ama kişisel repoda yorum yaptığımda, her zaman küresel resmi kullanıcı adı e-postasını alır
Bhupendra

@Bhupendra Örneğimde .gitconfig ve .gitconfig-job, proje dizinlerinde değil evimde. İkiden fazlasına mı ihtiyacınız var? Ana dizininizde, örneğimdeki .gitconfig-job olarak 3 satırlı bir .gitconfig-alternativ oluşturdunuz mu?
bcag2

@ bcag2 Ben de yukarıda verilen aynı örneği takip ettim. Ben varsayılan yapılandırma ve gitconfig-job benzer kişisel 2 yapılandırma var. Ben kişisel dizinde olduğum zaman, git config user.name bana doğru adı verir ama taahhüt itmek için varsayılan bir kişisel alırken gerekir.
swapnil2993

@ swapnil2993 ilk yol sorunu düşünüyorum ama bir git config user.namedoğru dönerseniz, Tamam olmalıdır. GNU / Linux veya başka bir işletim sistemi altında mısınız?
bcag2

@ bcag2 Sorun çözüldü. Sadece yolu düzeltti. Ancak git config user.name doğru değeri döndürerek garipti. Cevap için teşekkürler.
swapnil2993

14

Açık olmak gerekirse, geçerli depo yapılandırma dosyasını kullanmak --localiçin de kullanabilirsiniz :

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

12

Ayrıca ortam değişkenini kullanması gereken GIT_CONFIGbir dosyaya da işaret edebilirsiniz git config. İle GIT_CONFIG=~/.gitconfig-A git config key valuebelirtilen dosya manipüle alır.


2
Güzel; zeki kabuk büyü biraz ile bu şeyler ayarlamak için kullanılabilir böylece git dir repo üzerinde dir ağacı yukarı hareket ederken bulduğu ilk .gitconfig alır. Teşekkürler!
ecmanaut

1
Bunu yapan bu kabuk büyüsüne bir bağınız var mı? Kulağa yararlı geliyor!
pchiusano

1
@pchiusano İşte balıklarda temel bir sürüm github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root

Yalnızca bir ortam değişkeninin değiştirilmesini gerektiren basit bir çözüm için teşekkür ederiz.
Noah Sussman


12

Bunu şu şekilde e-postalarım için yapıyorum:

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

Sonra yeni bir iş projesini klonladığımda, sadece çalıştırmam gerekiyor git hobbyprofileve bu e-postayı kullanacak şekilde yapılandırılacak.


3

Başka bir yol, direnv kullanmak ve dizin başına yapılandırma dosyalarını ayırmaktır. Örneğin:

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

Her biri .envrcböyle bir şey içermelidir:

export GIT_CONFIG=$(pwd)/.gitconfig

Ve .gitconfigistenen değerlerle olağan gitconfig.


2

Depoya özgü yapılandırma dosyasını (ör. /path/to/repo/.git/config) Değiştirerek bir projenin Git yapılandırmasını özelleştirebilirsiniz . BTW, git configvarsayılan olarak bu dosyaya yazar:

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

Farklı projeler (örneğin içinde ~/.gitconfig.d/) için ayrı profiller oluşturmayı ve sonra bunları havuzun yapılandırma dosyasına eklemeyi tercih ederim :

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

Tek bir projeye ait birden çok depoda aynı seçenek kümesini kullanmanız gerekiyorsa bu iyi çalışır. Profilleri işlemek için kabuk takma adları veya özel bir Git komutu da ayarlayabilirsiniz.


0

Ben aynı gemideyim. Onları yönetmek için küçük bir bash senaryosu yazdım. 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

Buradaki betiğiniz Bash'ta, Github'da Python sürümünüz var. Ayrıca -sBash betiğinizde ele alınmaz.
Vadim Kotov

0

git stashYerel değişikliklerimi denerken bir hatayla karşılaştım . Git hatası "Lütfen bana kim olduğunu söyle" dedi ve sonra "Çalıştır git config --global user.email "you@example.comve git config --global user.name "Your name"hesabının varsayılan kimliğini ayarlamam" dedi. Ancak, kimliği yalnızca geçerli deponuzda ayarlamak için --global'ı atlamanız gerekir .

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.