Ich weiß, dass es möglich ist, Konfigurationen pro Repo festzulegen, die die Konfiguration auf Benutzerebene /path/to/my/repo/.gitconfig
überschreiben (dh überschreiben ~/.gitconfig
). Ist es möglich, Git-Konfigurationen festzulegen, die die Einstellungen auf Benutzerebene für alle untergeordneten Ordner eines bestimmten Ordners überschreiben? Dh ich habe
|--topLevelFolder1
|--\
| ---.gitconfig_override
|--\
| ---childFolder1
| \---[...]
|--\
| ---childFolder2
| \---[...]
Und ich möchte die definierten Einstellungen .gitconfig_override
in anzuwenden childFolder1
und childFolder2
.
Meine Motivation dafür ist folgende: Ich habe einen Arbeitslaptop, den ich auch in meiner Freizeit für persönliche Projekte benutze. Mein gesamter Arbeitscode ist in einem einzigen Ordner verschachtelt. Wenn ich zu Git-Repos drücke, muss ich dies mit meiner Arbeitsperson tun - Arbeitsanmeldung anstelle von Name und Arbeits-E-Mail. Wenn ich zu meinen persönlichen (Github-) Repos gehe, möchte ich dies mit meinem richtigen Namen und meiner persönlichen E-Mail-Adresse tun.
Andere mögliche Lösungen, an die ich gedacht habe (und Probleme):
- Erstellen Sie separate Benutzer für "Arbeiten" und "Spielen", stellen Sie die Einstellungen auf Benutzerebene entsprechend ein und melden Sie sich als geeigneter Benutzer an, wenn ich den Kontext wechsle (Ärger, und ich könnte leicht vergessen, zu wechseln).
- Erstellen Sie ein Skript, das in "workFolder" nach Git-Repos sucht und deren .gitconfig-Dateien hinzufügt / aktualisiert, um die entsprechenden Details zu speichern (wenn ich ein Repo erstelle und vergesse, das Skript vor dem Push auszuführen, werde ich als falsche Person pushen).
- "hack" git so, dass jedes Mal, wenn ein Repo erstellt wird, der Dateipfad überprüft und gegebenenfalls die .gitconfig-Datei aktualisiert wird (kompliziert, chaotisch und mit ziemlicher Sicherheit die falsche Vorgehensweise - außerdem hätte ich das nicht erster Hinweis, wie es geht!)
Ich habe diese Frage überprüft , die nur Lösungen für einzelne Repos zu enthalten scheint, nicht für mehrere. Hoffentlich wird jemand diese Frage sehen, der diese verpasst hat!
--global
Benutzereinstellungen sollten die Identität enthalten, die Sie häufiger verwenden. Jedes Repository, das die andere Identität verwenden sollte , sollteuser.name
unduser.email
entsprechend eingestellt.user.name
unduser.email
-Einstellungen in jedem der vorhandenen Repos hinzufügen und ein Cron-Skript einrichten, um sie zu neu hinzugefügten Repos hinzuzufügen, aber es wäre viel einfacher, wenn ich sie an einer einzigen Stelle festlegen könnte, die auf eine beliebige Stelle "herunterfiltert" Repos in untergeordneten Ordnern.Antworten:
BEARBEITEN: Git 2.13 führte bedingte Includes ein , die genau dieses Problem lösen sollen.
Meine ursprüngliche Antwort wird aus Gründen der Geschichte unten beibehalten (und Benutzer, die an älteren Versionen von git festhalten).
===================================
Das genaue gewünschte Verhalten wird nicht unterstützt, basierend auf dem Lesen der Manpage gitconfig.
Wie jedoch von git 1.7.12 liest Git Konfigurationsdaten aus vier verschiedenen Quellen , von denen zwei benutzerspezifisch sind:
$XDG_CONFIG_HOME/git/config
und~/.gitconfig
. Einträge in~/.gitconfig
überschreiben Einträge in$XDG_CONFIG_HOME/git/config
.Das heißt, Sie können Ihre persönliche gitconfig unter speichern
$XDG_CONFIG_HOME/git/config
und maschinenspezifische Überschreibungen einfügen~/.gitconfig
. Etwas wiein
~/.gitconfig
sollte Ihren E-Mail-Fall abdecken.Beachten Sie, dass git sucht, wenn $ XDG_CONFIG_HOME nicht festgelegt ist
~/.config/git/config
.Dies funktioniert gut für mich, da ich immer nur zwei persönliche Repos auf Arbeitsmaschinen habe (meine Emacs-Konfiguration und meine Punktedateien). Wenn Sie Ihren Arbeitsmaschinen häufig persönliche Repos hinzufügen, ist dies möglicherweise nicht gut genug für Sie.
In diesem Fall sind benutzerdefinierte Wrapper vorhanden
git init
undgit clone
die beste Wahl.Jede Binärdatei auf Ihrem $ PATH, deren Name mit 'git- *' übereinstimmt, kann als git-Befehl aufgerufen werden. Sie benötigen also nur ein Paar Shell-Skripte, die den ursprünglichen Befehl mit allen übergebenen Argumenten aufrufen, und kopieren dann die richtige Konfigurationsdatei in
.git/config
.quelle
direnv
. Siehe meine Antwort unten für alle Details.Wie in NateEags Bearbeitung erwähnt , sind die Conditional Includes von git perfekt dafür. Da diese Antwort die für Leute mit Git <2.13 ist, ist hier eine für diejenigen, die neuere Versionen haben.
Erstellen Sie zunächst irgendwo eine neue Konfigurationsdatei mit den Einstellungen, die in den Unterordnern wirksam werden sollen. Verwenden Sie beispielsweise die Ordner der ursprünglichen Frage
~/topLevelFolder1/.gitconfig_include
In
~/.gitconfig
hinzufügen:Jeder Unterordner von
~/topLevelFolder1
wird jetzt die Konfiguration in enthalten~/toplevelFolder1/.gitconfig_include
- es ist nicht erforderlich,.git/config
das Repo in jedem Unterordner manuell zu ändern . (Dies überschreibt nicht alles, was in der Unterordner-Konfiguration enthalten ist - es wird nur hinzugefügt , wie "Einschließen" impliziert.)quelle
/
) in dergitdir
Bedingung ist wichtig.includeIf
(und ein wenig Versuch und Irrtum) habe ich jetzt einen bestimmten Ordnerbaum auf meinem Arbeits-PC konfiguriert, in dem jede Git-Aktion mich als mein persönliches Konto identifiziert und meinen persönlichen SSH-Schlüssel zusammen mit einem verwendet ähnlicher Ordner für Arbeiten auf meinem persönlichen PC. In der Zwischenzeit verwendet der Rest jedes Systems auf beiden Computern die entsprechende E-Mail, den Namen und den SSH-Schlüssel. Ich wünschte nur, ich würde diese Antwort mehr als einmalif
Teil wirklich notwendig? Wenn der referenziertepath
nicht vorhanden ist, scheint der Eintrag ignoriert zu werden..git
Verzeichnissen in jedem übergeordneten Verzeichnis gesucht hätte ...Mit dem
direnv
Befehl können Sie Umgebungsvariablen festlegen, die für alle untergeordneten Ordner gelten. Sie können sich an einer beliebigen Stelle in dieser Verzeichnishierarchie befinden. Wenn die Git-Einstellung, die Sie festlegen möchten, von einer Umgebungsvariablen gesteuert werden kann, haben Sie Glück.Lesen Sie die
direnv
Basisseite http://direnv.net/ , um sie für Ihre Shell einzurichten. Für zsh war es so einfach, diese Linie am unteren Rand von my zu kleben.zshrc
und die Shell neu zu starten.Überprüfen Sie, ob die gewünschte Git-Einstellung von einer Umgebungsvariablen gesteuert werden kann. Es scheint, dass Sie
author.email
für einen bestimmten Verzeichnisbaum steuern möchten , der von der Umgebungsvariablen gesteuert wirdGIT_AUTHOR_EMAIL
. Beachten Sie, dass Umgebungsvariablen Vorrang vor config haben. Eine vollständige Liste der von git unterstützten Umgebungsvariablen finden Sie hier: https://git-scm.com/book/en/v2/Git-Internals-Environment-VariablesAs,
direnv
‚s - Seite gibt an , eine Datei mit dem Namen,.envrc
an der Wurzel der Hierarchie; in deinem Fall,topLevelFolder1
Zum Beispiel:
"Erlaube" der Umgebung:
direnv allow .
Das war's!Jedes Mal, wenn Sie in die Hierarchie springen,
direnv
finden Sie die besagte.envrc
Datei und laden sie.Wechseln Sie aus der Verzeichnisstruktur und
direnv
entladen Sie diese Variablenquelle
Der
[include]
Abschnitt in git config (.git/config
,~/.gitconfig
...) ist genau das , wonach Sie suchen.Siehe ausführlich beantwortete Frage: Ist es möglich, eine Datei in Ihre .gitconfig aufzunehmen?
Siehe git-config-Dokumentation: http://git-scm.com/docs/git-config#_includes
BEARBEITEN
Hinzufügen
childFolder1/.git/config
undchildFolder2/.git/config
:quelle
user.name
unduser.email
an einem Ort (in../.gitconfig_override
) zu definieren, aber ich denke nicht, dass es tatsächlich die ursprüngliche Frage beantwortet? WennchildFolder1
und untergeordnetchildFolder2
sindparentFolder
, habe ich nach einer Möglichkeit gesucht, Konfigurationswerte festzulegenparentFolder
, die auf alle in untergeordneten Ordnern verwurzelten Repos herunterfiltern.