Ist es möglich, unterschiedliche Git-Konfigurationen für unterschiedliche Projekte zu haben?


313

.gitconfigwird normalerweise im user.homeVerzeichnis gespeichert .

Ich verwende eine andere Identität, um an Projekten für Unternehmen A und etwas anderes für Unternehmen B zu arbeiten (hauptsächlich den Namen / die E-Mail-Adresse). Wie kann ich zwei verschiedene Git-Konfigurationen haben, damit meine Check-Ins nicht mit dem Namen / der E-Mail-Adresse übereinstimmen?

Antworten:


263

Die .git/configDatei in einem bestimmten Klon eines Repositorys ist lokal für diesen Klon. Alle dort vorgenommenen Einstellungen wirken sich nur auf Aktionen für das jeweilige Projekt aus.

(Standardmäßig git configändert .git/config, nicht ~/.gitconfig- nur mit --globalnicht verändert es das letztere.)


Wird das Ändern der Konfigurationsdatei in der Konfiguration für das Repo selbst, z. B. das Ändern des [user] email = ...Blocks, das globale überschreiben ~/.gitconfig- und dies ist nur für Ihren Benutzer?
dcsan

281

Es gibt 3 Ebenen der Git-Konfiguration. Projekt, global und System.

  • Projekt : Projektkonfigurationen sind nur für das aktuelle Projekt verfügbar und werden in .git / config im Projektverzeichnis gespeichert.
  • global : Globale Konfigurationen sind für alle Projekte für den aktuellen Benutzer verfügbar und in ~ / .gitconfig gespeichert.
  • System : Systemkonfigurationen sind für alle Benutzer / Projekte verfügbar und in / etc / gitconfig gespeichert.

Erstellen Sie eine projektspezifische Konfiguration. Sie müssen diese im Projektverzeichnis ausführen:

$ git config user.name "John Doe" 

Erstellen Sie eine globale Konfiguration:

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

Erstellen Sie eine Systemkonfiguration:

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

Und wie Sie sich vorstellen können, überschreibt das Projekt das globale und das globale Überschreibungssystem.


68
Gibt es eine Möglichkeit, eine "Verzeichnis" -Konfiguration vorzunehmen? Ich mache einen Job zu Hause und habe Ordner mit Arbeitsprojekten und meinen eigenen. Also habe ich Ordner ~ / job und ~ / my mit Git-Repos und möchte verschiedene Konfigurationen für Projekte unter ihnen. Zum Beispiel hat job / project1 eine Konfiguration von job / .gitconfig.
Serge

2
@ Serge Haben Sie jemals herausgefunden, ob es möglich ist, eine Konfiguration auf Verzeichnisebene zu erstellen? Ich habe jetzt das gleiche Problem.
Fragen

2
Nein, ich setze die Gesamtsystemkonfiguration auf persönliche Daten und erstelle ein Bash-Skript, um Jobdaten auf bestimmte Projektkonfigurationen in einem Befehl festzulegen.
Serge

1
Als Nachtrag: Nur git config user.nameoder git config user.emailzeigt Ihnen den Namen oder die E-Mail-Adresse, die Git für das aktuelle Repository verwendet.
Abhishek Divekar

1
Ich habe dies für zsh getan : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , ich hoffe, das hilft jemandem.
Pgarciacamou

219

Ab Git-Version 2.13 unterstützt Git bedingte Konfigurations-Includes . In diesem Beispiel klonen wir die Repos von Firma A im ~/company_aVerzeichnis und die Repos von Firma B in ~/company_b.

In deine .gitconfigkannst du so etwas stecken.

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

Beispielinhalt von .gitconfig-company_a

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

Beispielinhalt von .gitconfig-company_b

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

1
Es ist schön zu sehen, dass dies in Version 2.13 hinzugefügt wurde. Ich habe github.com/bddenhartog/git-profiles verwendet für eine Weile, konnte es aber nicht mit Tower zum Laufen bringen.
Adrum

4
includeWenn es etwas pingelig ist, siehe: stackoverflow.com/questions/43919191/…
Rubel

Die Dokumentationsseite, auf die Sie verlinkt haben, erwähnt dies nicht ... Tatsächlich liefert die Suche nach includeIf kein Ergebnis in der Dokumentation
Thomas Levesque

1
@ ThomasLevesque Das ist komisch. Ich bin sicher, es hat schon etwas darüber gesagt. Sie finden es im Changelog github.com/git/git/blob/master/Documentation/RelNotes/… und auch unter kernel.org/pub/software/scm/git/docs/git-config.html
crea1

2
@JosephLust müssen Sie git> = 2.13 installieren (Ubuntu 16.04 hat git 2.7) . Holen Sie sich die neueste Version von Git über Git PPA und es wird funktionieren :)
Cas

23

Danke @ crea1

Eine kleine Variante:

Wie es auf https://git-scm.com/docs/git-config#_includes geschrieben steht :

Wenn das Muster mit endet /, **wird es automatisch hinzugefügt. Zum Beispiel kann das Muster foo/wird foo/**. Mit anderen Worten, es passt foound alles im Inneren rekursiv zusammen.

Also benutze ich in meinem Fall
~ / .gitconfig :

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

Wenn sich das Projektverzeichnis in my befindet ~/wokspace/, werden die Standardbenutzereinstellungen durch
~ / .gitconfig-w ersetzt :

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

Wenn Sie dies getan haben, wird jetzt der richtige Benutzername und die richtige E-Mail-Adresse in verschiedenen Verzeichnissen festgelegt. Wenn ich git config user.name / git config user.email mache, erhalte ich korrekte Details. Aber wenn ich im persönlichen Repo kommentiere, wird immer die E-Mail des offiziellen offiziellen Benutzernamens abgerufen
Bhupendra

@ Bhupendra In meinem Beispiel befinden sich .gitconfig und .gitconfig-job bei mir zu Hause, nicht in Projektverzeichnissen. Benötigen Sie mehr als zwei? Haben Sie eine .gitconfig-Alternative in Ihrem Home-Verzeichnis als meinen .gitconfig-Job in meinem Beispiel mit 3 Zeilen erstellt?
bcag2

@ bcag2 Auch ich bin dem oben angegebenen Beispiel gefolgt. Ich habe 2 Konfigurationen, die standardmäßig funktionieren und persönlich ähnlich wie gitconfig-job sind. Wenn ich mich im persönlichen Verzeichnis befinde, gibt mir user.name in git config den richtigen Namen, aber für das Drücken des Commits wird der Standardname verwendet, während ich den persönlichen Namen benötige.
swapnil2993

@ swapnil2993 zuerst denke ich bei Pfadproblem, aber wenn es git config user.namerichtig ist, sollte es in Ordnung sein. Sind Sie unter GNU / Linux oder einem anderen Betriebssystem?
bcag2

@ bcag2 Das Problem wurde behoben. Habe gerade den Pfad korrigiert. Aber git config user.name, der den richtigen Wert zurückgibt, war seltsam. Danke für die Antwort.
swapnil2993

13

Um explizit zu sein, können Sie auch --localdie aktuelle Repository-Konfigurationsdatei verwenden :

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

12

Sie können die Umgebungsvariable auch GIT_CONFIGauf eine Datei verweisen, die git configverwendet werden soll. Mit GIT_CONFIG=~/.gitconfig-A git config key valueder angegebenen Datei wird manipuliert.


2
Cool; Mit ein bisschen cleverer Shell-Magie kann dies verwendet werden, um Dinge so einzurichten, dass Git die erste .gitconfig auswählt, die es findet, wenn es den Verzeichnisbaum über dem aktuellen Repo durchquert. Vielen Dank!
Ecmanaut

1
Haben Sie einen Link zu dieser Muschelmagie, die dies tut? Klingt nützlich!
Pchiusano

1
@pchiusano hier ist eine rudimentäre Version davon in Fisch github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root

Vielen Dank für eine einfache Lösung, bei der nur eine Umgebungsvariable geändert werden muss.
Noah Sussman


12

Ich mache das für meine E-Mail folgendermaßen:

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

Wenn ich dann ein neues Arbeitsprojekt klone, muss ich es nur ausführen git hobbyprofileund es wird für die Verwendung dieser E-Mail konfiguriert.


3

Eine andere Möglichkeit besteht darin, direnv zu verwenden und Konfigurationsdateien pro Verzeichnis zu trennen. Zum Beispiel:

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

Jedes .envrcsollte so etwas enthalten:

export GIT_CONFIG=$(pwd)/.gitconfig

Und .gitconfigist gitconfig mit gewünschten Werten üblich.


2

Sie können die Git-Konfiguration eines Projekts anpassen, indem Sie die repository-spezifische Konfigurationsdatei (dh /path/to/repo/.git/config) ändern . Übrigens, git configschreibt standardmäßig in diese Datei:

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

Ich ziehe es separate Profile für verschiedene Projekte erstellen (zB in ~/.gitconfig.d/) und dann ist sie in der Konfigurationsdatei des Repository:

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

Dies funktioniert gut, wenn Sie denselben Optionssatz in mehreren Repos verwenden müssen, die zu einem einzelnen Projekt gehören. Sie können auch Shell-Aliase oder einen benutzerdefinierten Git-Befehl einrichten, um die Profile zu bearbeiten.


0

Ich bin im selben Boot. Ich habe ein kleines Bash-Skript geschrieben, um sie zu verwalten. 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

Ihr Skript hier ist in Bash, während Sie auf Github die Python-Version haben. Wird auch -sin Ihrem Bash-Skript nicht behandelt.
Vadim Kotov

0

Beim Versuch, git stashmeine lokalen Änderungen vorzunehmen, ist ein Fehler aufgetreten . Der Fehler von git sagte "Bitte sag mir, wer du bist" und sagte mir dann "Ausführen git config --global user.email "you@example.comund git config --global user.name "Your name"die Standardidentität deines Kontos festlegen". Sie müssen jedoch --global weglassen , um die Identität nur in Ihrem aktuellen Repository festzulegen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.