Ist es möglich, eine Datei in Ihre .gitconfig aufzunehmen?

245

Ich möchte eine Datei in meine .gitconfig aufnehmen, die meine Github-Einstellungen enthält - ist das möglich?

Kann ich so etwas machen:

[core]
    include = /path/to/file
David Reynolds
quelle
3
"Ich möchte die Github-Details nicht einschließen, deshalb möchte ich sie irgendwie aus einer externen Datei einfügen": Genau dafür ist die globale Konfigurationsdatei gedacht. Gibt es einen Grund, es in Ihrem Fall nicht zu verwenden?
VonC
11
Ja, weil ich die .gitconfig in einem Git-Repository veröffentlichen möchte und nicht möchte, dass jemand meine Github-Anmeldeinformationen stiehlt.
David Reynolds
Ich folge Ihnen nicht: Ihre reguläre gitconfig-Datei wird in github veröffentlicht, jedoch ohne Github-Einstellungen. Warum? Da diese in Ihrer globalen Konfigurationsdatei ( ~/.gitconfig) enthalten wären , dh nicht in Ihr Github-Repo verschoben würden. Wenn Sie ' git config' eingeben, sehen Sie die Verkettung der 3-Konfigurationsdatei (Repo, Global und System). Nur die Repo-Konfigurationsdatei wird gepusht. Die 2 anderen bleiben vor Ort.
VonC
90
es sieht so aus, als hätten alle den Punkt dieser Frage verpasst. David möchte offensichtlich ein Repo aller seiner Punktedateien (bashrc, gemrc usw.), einschließlich seiner .gitconfig, aufrufen, damit er alle seine Einstellungen auf allen seinen Maschinen haben kann. Eine Möglichkeit, Teile einer .gitconfig-Datei durch Einschließen und Ignorieren privater Einträge zu verschieben, ist das, wonach er (und ich) gesucht haben
Bo Jeanes,
5
@bjeanes: genau! Ich habe immer noch keinen Weg gefunden, dies zu tun.
David Reynolds

Antworten:

302

Git (1.7.10+) unterstützt diese Syntax jetzt in .gitconfig:

[include]
    path = /path/to/file

Sehen Sie hier für eine detaillierte Beschreibung der git Wandel und seine Grenzfälle.

Übrigens ein paar Feinheiten, auf die es sich hinzuweisen lohnt:

  1. Eine umgebungsvariable Erweiterung wird z. B. $HOMEnicht unterstützt. (Erweiterung von ~erschien in Git 1.7.10.2.)

  2. Wenn ein relativer Pfad angegeben wird, bezieht er sich auf die .gitconfig-Datei mit der [include]Anweisung. Dies funktioniert auch über verkettete Includes hinweg korrekt - zB ~/.gitconfigkönnen:

    [include]
        path = subdir/gitconfig
    

    und subdir/gitconfigkann haben:

    [include]
        path = nested_subdir/gitconfig
    

    ... was dazu führen wird subdir/nested_subdir/gitconfig, dass geladen wird.

  3. Wenn git die Zieldatei nicht finden kann, ignoriert es den Fehler stillschweigend. Dies scheint beabsichtigt zu sein.

Mike Morearty
quelle
7
eigentlich brauchst du nicht ~. Dies liegt daran, dass sich Ihre .gitconfig-Datei immer noch in ~/.gitconfigeinem relativen Pfad in der Konfiguration befinden muss, was bedeuten würde ~...
robustus
2
Die ~/ $HOME-Erweiterung ist tatsächlich ab git describe --contains 4c0a89fc-> v1.7.10.2~12^2(dh v1.7.10.2oder später), bemerkenswert, da Debian 7 und Ubuntu Quantal anscheinend mit veröffentlicht werden v1.7.10.4.
FauxFaux
1
Unterstützt dies Globs? zB path = ~ / gitconfig.d / *?
Bret
1
@Bret nein, dies unterstützt keine Globs.
Mike Morearty
8
Beachten Sie, dass Konfigurationen enthalten diese Art und Weise wird nicht angezeigt , wenn eine bestimmte Datei angegeben ist (das heißt, mit --global, --localoder --file), es sei denn , explizit gesagt , mit --includes(wie git config --global --includes --list).
Franklin Yu
16

Update 2012:

Siehe Mike Morearty ‚s Antwort :

Beinhaltet

Sie können eine Konfigurationsdatei aus einer anderen einschließen, indem Sie die spezielle include.pathVariable auf den Namen der einzuschließenden Datei setzen .
Die eingeschlossene Datei wird sofort erweitert, als ob ihr Inhalt am Speicherort der include-Direktive gefunden worden wäre.
Wenn der Wert der include.pathVariablen ein relativer Pfad ist, wird der Pfad als relativ zur Konfigurationsdatei betrachtet, in der die include-Direktive gefunden wurde.
Der Wert von include.pathunterliegt der Tilde-Erweiterung: Er ~/wird auf den Wert von $HOMEund ~user/auf das Home-Verzeichnis des angegebenen Benutzers erweitert.


Ich glaube nicht.

Ich würde diese Einstellung lieber in die ~/.gitconfigDatei einfügen

Benutzerspezifische Konfigurationsdatei. Wird auch als "globale" Konfigurationsdatei bezeichnet.

Auf diese Weise wird die projektspezifische Datei .gitconfig vervollständigt, ohne veröffentlicht zu werden, wenn sie an GitHub gesendet wird. Weitere Informationen zur globalen Konfigurationsdatei finden Sie auch in dieser SO-Antwort .
Git hat 3 Konfigurationsdateien .


bjeanes fügt in den Kommentaren hinzu:

es sieht so aus, als hätten alle den Punkt dieser Frage verpasst.
David will offenbar ein Repo aller seiner Punkt - Dateien drücken ( bashrc, gemrcusw.) einschließlich seiner .gitconfigso kann er auf alle seine Maschinen alle seine Einstellungen.
Eine Möglichkeit, Teile einer .gitconfigDatei durch Einschließen und Ignorieren privater Einträge zu verschieben, ist das, wonach er (und ich) suchen.

Eine mögliche Möglichkeit wäre die Verwendung eines Smudge / Clean-Filtertreibers zum Entschlüsseln / Verschlüsseln einer Datei mit privaten vertraulichen Informationen (siehe diesen Thread ), um eine lokale Datei wie ~ / .gitconfig mit den dafür relevanten entschlüsselten Teilen zu vervollständigen Datei.

Auf diese Weise können Sie ein Git-Repo mit all Ihren Punktedateien sowie eine Datei mit verschlüsselten Informationen erstellen, die entschlüsselt und zu diesen Punktdateien hinzugefügt werden sollen.

Alt-Text

In .gitattributes(oder .git/info/a..) Verwendung:

myPrivateInfosFile filter=gpg diff=gpg

In Ihrer Repo-Konfigurationsdatei:

[filter "gpg"]
smudge = gpg -d -q --batch --no-tty
clean = gpg -ea -q --batch --no-tty -r C920A124
[diff "gpg"]
textconv = decrypt

(Eine GPG-basierte Lösung bedeutet natürlich, dass Sie Ihre privaten / öffentlichen Schlüssel auf andere Weise auf den Zielcomputer übertragen haben, auf dem Sie alle Ihre Punktedateien wiederherstellen möchten, indem Sie dieses spezielle Repo klonen.)

In Ihrem Fall muss das Smudge-Skript tatsächlich abgeschlossen werden, da nach dem Entschlüsseln dieser Datei relevante Teile zu Ihrer globalen ~/.gitconfigDatei hinzugefügt werden müssen (es sei denn, Sie überschreiben die globale Konfigurationsdatei mit einem anderen Speicherort ) oder andere Punktdateien dafür Angelegenheit.

https://kerneltrap.org/mailarchive/git/2008/3/13/1153274/thread (GPG-Unannehmlichkeiten werden in diesem Thread weiter erläutert ) (dies unterscheidet sich von einem vollständig verschlüsselten Git-Repo, wie hier beschrieben ).

VonC
quelle
5
Ich möchte meine grundlegende .gitconfig-Datei in einem Git-Repository veröffentlichen, aber ich möchte die Github-Details nicht darin aufnehmen, weshalb ich sie irgendwie aus einer externen Datei einfügen möchte.
David Reynolds
10

Sie können es über die Befehlszeile laden:

$ git config --local include.path "/path/to/.gitconfig"

Verwenden Sie "$PWD"/.gitconfigstattdessen, wenn Sie die Datei aus dem aktuellen Verzeichnis laden möchten.

Nachdem Sie den obigen Befehl ausgeführt haben, werden die folgenden Zeilen zu Ihrer .git/configDatei hinzugefügt :

[include]
        path = /path/to/.gitconfig
Kenorb
quelle
2

Ich glaube, Sie können dies mit dem Hub-Tool von defunkt erreichen . Dies ist ein Wrapper für den Git - Befehl, der unter anderem die Sie haben kann GITHUB_USERund GITHUB_TOKENUmgebungsvariablen. Dadurch werden die Einstellungen in der lokalen .gitconfigDatei überschrieben .

Um den Benutzer, auf den Sie alias git=hubin seiner ZSH-Konfiguration verwiesen haben, nahtlos zu machen . Sie sollten dann in der Lage sein, eine lokale Datei zu erstellen, in der Sie Ihre Umgebungsvariablen festlegen und Ihr Repository mit all Ihren privaten Informationen in die öffentliche Welt verschieben.

** HINWEIS Für Homebrew-Benutzer unter OSX können Sie das Tool über installieren brew install hub.

Geoff Lanotte
quelle