Czy można mieć inną konfigurację Git dla różnych projektów?

314

.gitconfigjest zwykle przechowywany w user.homekatalogu.

Używam innej tożsamości do pracy nad projektami dla Firmy A i czegoś innego dla Firmy B (głównie nazwa / adres e-mail). Jak mogę mieć dwie różne konfiguracje Git, aby moje zameldowania nie przebiegały z nazwą / adresem e-mail?

priya
źródło

Odpowiedzi:

264

.git/configPlik w konkretnym klonem repozytorium jest lokalny dla tego klonu. Wszelkie umieszczone tam ustawienia będą miały wpływ tylko na działania dla tego konkretnego projektu.

(Domyślnie git configmodyfikuje .git/config, nie ~/.gitconfigtylko - --globalmodyfikuje to drugie).

Bursztyn
źródło
więc modyfikacja pliku konfiguracyjnego w konfiguracji dla samego repozytorium, na przykład zmiana [user] email = ...bloku, zastąpi globalną ~/.gitconfig- a to tylko dla twojego użytkownika?
dcsan
282

Istnieją 3 poziomy konfiguracji git; projekt, globalny i systemowy.

  • projekt : Konfiguracje projektu są dostępne tylko dla bieżącego projektu i przechowywane w .git / config w katalogu projektu.
  • global : Globalne konfiguracje są dostępne dla wszystkich projektów dla bieżącego użytkownika i przechowywane w ~ / .gitconfig.
  • system : Konfiguracje systemu są dostępne dla wszystkich użytkowników / projektów i przechowywane w / etc / gitconfig.

Utwórz konfigurację specyficzną dla projektu, musisz wykonać to w katalogu projektu:

$ git config user.name "John Doe" 

Utwórz konfigurację globalną:

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

Utwórz konfigurację systemu:

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

I jak można się domyślać, projekt zastępuje globalny i globalny system zastępuje.

teymourlouie
źródło
68
Czy istnieje możliwość wykonania konfiguracji „katalogu”? Pracuję w domu i mam foldery z projektami do pracy i własnymi. Mam więc foldery ~ / job i ~ / my z repozytoriami git i chcę różnych konfiguracji dla projektów w ich obrębie. Np. Zadanie / projekt1 ma konfigurację z zadania / .gitconfig.
Serge
2
@ Serge, czy kiedykolwiek zastanawiałeś się, czy można utworzyć konfigurację na poziomie katalogu? Mam teraz ten sam problem.
Przesłuchanie
2
Nie. Ustawiłem ogólną konfigurację systemu na dane osobowe i wykonuję skrypt bash, aby ustawić dane zadania dla niektórych konfiguracji projektu za pomocą jednego polecenia.
Serge
1
Jako dodatek: tylko git config user.nameczy git config user.emailpokaże nazwę lub napisz Git użyje bieżącego respository.
Abhishek Divekar
1
Skończyło się to na zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , mam nadzieję, że to komuś pomoże.
pgarciacamou
219

Począwszy od wersji 2.13 git, git obsługuje konfigurację warunkową . W tym przykładzie sklonowaliśmy repozytorium Firmy A w ~/company_akatalogu, a repozytorium Firmy B w ~/company_b.

W swoim .gitconfigmożesz umieścić coś takiego.

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

Przykładowa zawartość pliku .gitconfig-company_a

[user]
name = John Smith
email = [email protected]

Przykładowa zawartość pliku .gitconfig-company_b

[user]
name = John Smith
email = [email protected]
crea1
źródło
1
Wspaniale jest widzieć, że zostało to dodane w wersji 2.13. Od jakiegoś czasu korzystam z github.com/bddenhartog/git-profiles , ale nie mogłem go uruchomić z Tower.
adrum
4
includeJeśli jest trochę wybredny, patrz: stackoverflow.com/questions/43919191/...
rubel
Strona z dokumentacją, do której linkujesz, nie wspomina o tym ... w rzeczywistości szukanie opcji include Jeśli dokumentacja nie da żadnego rezultatu
Thomas Levesque,
1
@ThomasLevesque To dziwne. Jestem pewien, że wcześniej coś o tym mówiło. Można go znaleźć w dzienniku zmian github.com/git/git/blob/master/Documentation/RelNotes/... a także na stronie kernel.org/pub/software/scm/git/docs/git-config.html
crea1
2
@JosephLust musisz zainstalować git> = 2.13 (Ubuntu 16.04 ma git 2.7) . Pobierz najnowszą wersję git przez Git PPA i zadziała :)
Cas
24

Dzięki @ crea1

Mały wariant:

Jak napisano na https://git-scm.com/docs/git-config#_includes :

Jeśli wzór zakończy się na /, **zostanie automatycznie dodany. Na przykład wzór foo/staje się foo/**. Innymi słowy foo, rekurencyjnie pasuje i wszystko w środku.

Więc używam w moim przypadku
~ / .gitconfig :

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

# all others section: core, alias, log…

Więc jeśli katalog projektu znajduje się w moim ~/wokspace/, domyślne ustawienia użytkownika są zastępowane przez
~ / .gitconfig-w :

[user]
name = John Smith
email = [email protected]
bcag2
źródło
Zrobiono to, teraz poprawna nazwa użytkownika i adres e-mail są ustawione w różnych katalogach. Kiedy robię git config user.name / git config user.email otrzymuję poprawne dane. Ale kiedy wypowiedzieć w osobistym repo, to zawsze podnosi globalnego Wiadomość oficjalna nazwa użytkownika
Bhupendra
@ Bhupendra W mojej próbce .gitconfig i .gitconfig-job są w moim domu, a nie w katalogach projektów. Potrzebujesz więcej niż dwóch? Czy utworzyłeś .gitconfig-alternativ w swoim katalogu domowym, tak jak mój .gitconfig-job w mojej próbce, z 3 liniami.
bcag2,
@ bcag2 Ja również podążyłem za tym samym przykładem podanym powyżej. Mam 2 konfiguracje do pracy domyślną i osobistą podobną do gitconfig-job. Kiedy jestem w katalogu osobistym, na git config użytkownik.nazwa daje mi poprawną nazwę, ale do wypchnięcia zatwierdzenia przyjmuje domyślny, a ja potrzebuję osobistego.
swapnil2993
@ swapnil2993 najpierw myślę, że problem ze ścieżką, ale jeśli git config user.namezwróci prawidłowy, powinien być w porządku. Czy korzystasz z systemu GNU / Linux lub innego systemu operacyjnego?
bcag2
@ bcag2 Rozwiązano problem. Właśnie poprawiłem ścieżkę. Ale git config nazwa_użytkownika zwracająca prawidłową wartość była dziwna. Dziękuję za odpowiedź.
swapnil2993
14

Mówiąc wprost, możesz także --localużyć bieżącego pliku konfiguracyjnego repozytorium :

git config --local user.name "John Doe" 
naśladować
źródło
12

Możesz także wskazać zmienną środowiskową GIT_CONFIGna plik, który git configpowinien zostać użyty. Z GIT_CONFIG=~/.gitconfig-A git config key valuepodanym plikiem zostaje zmanipulowany.

Stefan Näwe
źródło
2
Chłodny; z odrobiną sprytnej magii powłoki można go użyć do konfiguracji, więc git wybiera pierwszą .gitconfig, którą znajdzie, gdy przemierza drzewo katalogów powyżej aktualnego repo. Dzięki!
ecmanaut
1
Czy masz link do tej magii powłoki, która to robi? Brzmi użytecznie!
pchiusano,
1
@pchiusano tutaj jest podstawowa wersja tego w rybach github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root
Dziękujemy za proste rozwiązanie, które wymaga zmiany tylko jednej zmiennej środowiskowej.
Noah Sussman
wpływa tylko na polecenie git config teraz github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010
12

Robię to dla mojego e-maila w następujący sposób:

git config --global alias.hobbyprofile 'config user.email "[email protected]"'

Następnie, gdy sklonuję nowy projekt roboczy, muszę tylko uruchomić git hobbyprofilei zostanie on skonfigurowany do używania tego e-maila.

ivand58
źródło
3

Innym sposobem jest użycie direnv i oddzielenie plików konfiguracyjnych dla każdego katalogu. Na przykład:

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

Każdy .envrcpowinien zawierać coś takiego:

export GIT_CONFIG=$(pwd)/.gitconfig

I .gitconfigjest zwykle gitconfig z pożądanymi wartościami.

Niemiecki Lashevich
źródło
2

Możesz dostosować konfigurację Git projektu, zmieniając plik konfiguracyjny specyficzny dla repozytorium (tj /path/to/repo/.git/config.). BTW, git configdomyślnie zapisuje do tego pliku:

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

Wolę utworzyć osobne profile dla różnych projektów (np. W ~/.gitconfig.d/), a następnie dołączyć je do pliku konfiguracyjnego repozytorium:

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

Działa to dobrze, jeśli trzeba użyć tego samego zestawu opcji w wielu repozytoriach należących do jednego projektu. Możesz także skonfigurować aliasy powłoki lub niestandardowe polecenie Git do manipulowania profilami.

Eugene Yarmash
źródło
0

Jestem na tej samej łodzi. Napisałem mały skrypt bash, aby nimi zarządzać. 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 <[email protected]>

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
netizen24601
źródło
Twój skrypt tutaj jest w Bash, podczas gdy na Github masz wersję Python. Nie -sjest również obsługiwane w skrypcie Bash.
Vadim Kotov
0

Wystąpił błąd podczas próby wprowadzenia git stashlokalnych zmian. Błąd z git brzmiał „Powiedz mi, kim jesteś”, a następnie powiedział „Uruchom git config --global user.email "[email protected]i git config --global user.name "Your name"ustaw domyślną tożsamość konta”. Musisz jednak pominąć opcję --global, aby ustawić tożsamość tylko w bieżącym repozytorium.

Erich Meissner
źródło