Git
Chapters ▾ 2nd Edition

10.8 Git Interna - Umgebungsvariablen

Umgebungsvariablen

Git läuft immer in einer bash-Shell und verwendet eine Reihe von Shell-Umgebungsvariablen, über die man steuern kann, wie es sich verhält. Gelegentlich ist es hilfreich zu wissen, welche diese sind und wie Sie Git dazu bringen können, sich so zu verhalten, wie Sie es möchten. Dies ist keine vollständige Liste aller Umgebungsvariablen auf die Git achtet, aber wir werden die nützlichsten behandeln.

Globals Verhalten

Einige der generellen Eigenschaften von Git als Computerprogramm hängen von Umgebungsvariablen ab.

GIT_EXEC_PATH bestimmt, wo Git nach seinen Unterprogrammen sucht (wie git-commit, git-diff und andere). Sie können die aktuelle Einstellung überprüfen, indem Sie git --exec-path ausführen.

HOME wird normalerweise nicht als anpassbar angesehen (zu viele andere Dinge hängen davon ab), aber hier sucht Git nach der globalen Konfigurationsdatei. Wenn Sie eine wirklich portable Git-Installation mit globaler Konfiguration wünschen, können Sie HOME im portablen Git Shell-Profil überschreiben.

PREFIX ist ähnlich, jedoch für die systemweite Konfiguration. Git sucht nach dieser Datei unter $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM, falls gesetzt, deaktiviert die Verwendung der systemweiten Konfigurationsdatei. Dies ist nützlich, wenn Ihre Systemkonfiguration Ihre Befehle beeinträchtigt, Sie jedoch keinen Zugriff haben, um diese zu ändern oder zu entfernen.

GIT_PAGER steuert das Programm, mit dem mehrseitige Ausgaben in der Befehlszeile angezeigt werden. Ist dies nicht gesetzt, wird PAGER als Fallback verwendet.

GIT_EDITOR ist der Editor, den Git startet, wenn der Benutzer Text bearbeiten muss (z.B. eine Commit-Nachricht). Wenn nicht gesetzt, wird EDITOR verwendet.

Speicherort des Repositorys

Git verwendet mehrere Umgebungsvariablen, um die Verbindung zum aktuellen Repository herzustellen.

GIT_DIR ist der Speicherort des Ordners .git. Wenn dies nicht angegeben ist, geht Git nach oben durch den Verzeichnisbaum, bis es zu ~ oder / gelangt, und sucht bei jedem Schritt nach einem .git-Verzeichnis.

GIT_CEILING_DIRECTORIES steuert das Verhalten bei der Suche nach einem .git Verzeichnis. ``` Wenn Sie auf Verzeichnisse zugreifen, die nur langsam geladen werden können (z.B. auf einem Bandlaufwerk oder über eine langsame Netzwerkverbindung), möchten Sie möglicherweise, dass Git den Versuch vorzeitig abbricht, insbesondere wenn Git in der Kommandozeile aufgerufen wird.

GIT_WORK_TREE ist der Speicherort des Stammverzeichnisses eines Arbeitsverzeichnisses für ein non-bare Repository. Wenn --git-dir oder GIT_DIR angegeben ist, jedoch nicht --work-tree, GIT_WORK_TREE oder core.worktree, wird das aktuelle Arbeitsverzeichnis als oberste Ebene Ihres Arbeitsbaums betrachtet.

GIT_INDEX_FILE ist der Pfad zur Indexdatei (nur für non-bare Repositorys).

GIT_OBJECT_DIRECTORY kann verwendet werden, um den Speicherort des Verzeichnisses anzugeben, das sich normalerweise in .git/objects befindet.

GIT_ALTERNATE_OBJECT_DIRECTORIES ist eine durch Doppelpunkte getrennte Liste (also im Format /dir/one:/dir/two:… `), die Git mitteilt, wo nach Objekten gesucht werden soll, wenn sie sich nicht in GIT_OBJECT_DIRECTORY` befinden. Wenn Sie viele Projekte mit großen Dateien haben, die genau den gleichen Inhalt haben, können Sie damit vermeiden, dass zu viele Kopien davon gespeichert werden.

Pfadspezifikation (engl. Pathspec)

„Pathspec“ bezieht sich darauf, wie Sie Pfade in Git angeben, einschließlich der Verwendung von Platzhaltern. Diese werden in der Datei .gitignore aber auch in der Befehlszeile (git add *.c) verwendet.

GIT_GLOB_PATHSPECS und GIT_NOGLOB_PATHSPECS steuern das Standardverhalten von Platzhaltern in Pfadangaben. Wenn GIT_GLOB_PATHSPECS auf 1 gesetzt ist, werden Platzhalterzeichen als Platzhalter verwendet (dies ist die Standardeinstellung). Wenn GIT_NOGLOB_PATHSPECS auf 1 gesetzt ist, stimmen Platzhalterzeichen nur mit sich selbst überein. Dies bedeutet, dass *.c nur mit einer Datei namens „* .c“ übereinstimmt und nicht mit einer Datei, deren Name mit .c endet. Sie können dies in Einzelfällen überschreiben, indem Sie die Pfadangabe mit :(glob) oder :(literal) beginnen, wie in :(glob)*.c.

GIT_LITERAL_PATHSPECS deaktiviert beide oben genannten Verhaltensweisen. Es können keine Platzhalterzeichen verwendet werden, und die Präfixe zum Überschreiben sind ebenfalls deaktiviert.

GIT_ICASE_PATHSPECS setzt alle Pfadangaben so, dass zwischen Groß- und Kleinschreibung nicht unterschieden wird.

Committen

Die endgültige Erstellung eines Git-Commit-Objekts erfolgt normalerweise über git-commit-tree, das diese Umgebungsvariablen als primäre Informationsquelle verwendet und nur dann auf Konfigurationswerte zurückgreift, wenn diese nicht vorhanden sind.

  • GIT_AUTHOR_NAME * ist der für Menschen lesbare Name im Feld „author“.

  • GIT_AUTHOR_EMAIL * ist die E-Mail-Adresse für das Feld „author“.

  • GIT_AUTHOR_DATE * ist der Zeitstempel für das Feld „author“.

  • GIT_COMMITTER_NAME * legt den für Menschen lesbaren Namen für das Feld „Committer“ fest.

GIT_COMMITTER_EMAIL ist die E-Mail-Adresse für das Feld „Committer“.

GIT_COMMITTER_DATE wird für den Zeitstempel im Feld „Committer“ verwendet.

EMAIL ist die Ersatz-E-Mail-Adresse für den Fall, dass der Konfigurationswert user.email nicht festgelegt ist. Wenn this nicht festgelegt ist, greift Git auf die Systembenutzer und Hostnamen zurück.

Netzwerk

Git verwendet die Bibliothek curl, um Netzwerkoperationen über HTTP durchzuführen. GIT_CURL_VERBOSE weist Git an, alle von dieser Bibliothek generierten Nachrichten auszugeben. Dies ähnelt dem Ausführen von curl -v in der Befehlszeile.

GIT_SSL_NO_VERIFY weist Git an, SSL-Zertifikate nicht zu verifizieren. Dies kann manchmal erforderlich sein, wenn Sie ein selbstsigniertes Zertifikat verwenden, um Git-Repositorys über HTTPS bereitzustellen, oder wenn Sie gerade einen Git-Server einrichten, aber noch kein vollständiges Zertifikat installiert haben.

Wenn die Datenrate einer HTTP-Operation unter GIT_HTTP_LOW_SPEED_LIMIT Bytes pro Sekunde und länger als GIT_HTTP_LOW_SPEED_TIME Sekunden anhält, bricht Git diese Operation ab. Diese Werte überschreiben die Konfigurationswerte http.lowSpeedLimit und http.lowSpeedTime.

GIT_HTTP_USER_AGENT legt die User-Agent-Zeichenfolge fest, die von Git bei der Kommunikation über HTTP verwendet wird. Der Standardwert ist ein Wert wie git/2.0.0.

Vergleichen und Zusammenführen

GIT_DIFF_OPTS ist eigentlich ein unzutreffender Name. Die einzigen gültigen Werte sind -u<n> oder --unified=<n>, wodurch die Anzahl der in einem git diff-Befehl angezeigten Kontextzeilen konfiguriert wird.

GIT_EXTERNAL_DIFF überschreibt den Konfigurationswert diff.external. Wenn diese Variable gesetzt ist, ruft Git dieses Programm auf, wenn git diff aufgerufen wird.

GIT_DIFF_PATH_COUNTER und GIT_DIFF_PATH_TOTAL sind innerhalb des durch GIT_EXTERNAL_DIFF oder` diff.external` angegebenen Programms nützlich. Ersteres gibt an, welche Datei in einer Reihe von Dateien verglichen wird (beginnend mit 1), und Letzteres gibt die Gesamtzahl der Dateien im Stapel an.

GIT_MERGE_VERBOSITY steuert die Ausgabe für die rekursive Merge-Strategie. Folgende Werte sind zulässig:

  • 0 gibt nichts aus, außer einer einzelnen Fehlermeldung (möglicherweise).

  • 1 zeigt nur Konflikte.

  • 2 zeigt auch Dateiänderungen an.

  • 3 zeigt an, wann Dateien übersprungen werden, weil sie sich nicht geändert haben.

  • 4 zeigt alle Pfade, während sie verarbeitet werden.

  • 5 und höher zeigen detaillierte Debugging-Informationen.

Der Standardwert ist 2.

Debugging

Möchten Sie wirklich wissen, was in Git abgeht? In Git ist eine umfangreiche Sammlung von Traces eingebettet, alles was Sie tun müssen, ist sie einzuschalten. Die möglichen Werte dieser Variablen lauten wie folgt:

  • „true“, „1“ oder „2“ - die Trace-Kategorie wird nach stderr geschrieben.

  • Ein absoluter Pfad, der mit / beginnt - die Trace-Ausgabe wird in diese Datei geschrieben.

GIT_TRACE steuert allgemeine Traces, die keiner bestimmten Kategorie zugeordnet werden können. Dies umfasst die Erweiterung von Aliasen und die Delegierung an andere Unterprogramme.

$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554               trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341       trace: run_command: 'git-lga'
20:12:49.879529 git.c:282               trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349               trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341       trace: run_command: 'less'
20:12:49.899675 run-command.c:192       trace: exec: 'less'

GIT_TRACE_PACK_ACCESS steuert das Tracing der Packfile-Zugriffe. Das erste Feld ist die Packdatei, auf die zugegriffen wird, das zweite Feld ist der Offset in dieser Datei:

$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

GIT_TRACE_PACKET aktiviert die Paketverfolgung für Netzwerkoperationen.

$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46           packet:          git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46           packet:          git< 0000
20:15:14.867079 pkt-line.c:46           packet:          git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46           packet:          git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46           packet:          git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]

GIT_TRACE_PERFORMANCE steuert die Protokollierung von Performancedaten. Die Ausgabe zeigt, wie lange jeder einzelne Aufruf von git dauert.

$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414             performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414             performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414             performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414             performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414             performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414             performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414             performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414             performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414             performance: 6.112217000 s: git command: 'git' 'gc'

GIT_TRACE_SETUP zeigt Informationen darüber an, was Git über das Repository und die Umgebung, mit denen es interagiert, herausfindet.

$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315             setup: git_dir: .git
20:19:47.087184 trace.c:316             setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317             setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318             setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Sonstiges

GIT_SSH, falls angegeben, ist ein Programm, das anstelle von ssh aufgerufen wird, um eine Verbindung zu einem SSH-Host herzustellen. Es wird folgendermaßen aufgerufen: $GIT_SSH [username@]host [-p <port>] <befehl>. Beachten Sie, dass dies nicht der einfachste Weg ist, um zu konfigurieren, wie ssh aufgerufen wird. Es werden keine zusätzlichen Befehlszeilenparameter unterstützt, daher müssen Sie ein Wrapper-Skript schreiben und GIT_SSH so einstellen, dass es darauf verweist. Es ist wahrscheinlich einfacher, dafür einfach die Datei ~/.ssh/config zu verwenden.

GIT_ASKPASS dient zur Überschreibung des Konfigurationswertes core.askpass. Dies ist das Programm, das immer dann aufgerufen wird, wenn Git den Benutzer nach Anmeldeinformationen fragen muss, wobei eine Eingabeaufforderung als Befehlszeilenargument erwartet wird und die eine Antwort auf stdout zurückgeben soll. Weitere Informationen zu diesem Subsystem finden Sie unter Anmeldeinformationen speichern.

GIT_NAMESPACE steuert den Zugriff auf namenspaced refs und entspricht dem Flag --namespace. Dies ist vor allem auf der Serverseite nützlich, wo Sie möglicherweise mehrere Forks eines einzelnen Repositorys in einem Repository speichern möchten, wobei nur die Refs getrennt bleiben.

GIT_FLUSH kann verwendet werden, um Git zu zwingen, nicht gepuffertes I/O zu verwenden, wenn inkrementell in stdout geschrieben wird. Ein Wert von 1 bewirkt, dass Gits Puffer öfter geleert wird. Ein Wert von 0 bewirkt, dass alle Ausgaben gepuffert werden. Der Standardwert (falls diese Variable nicht festgelegt ist) ist die Auswahl eines geeigneten Pufferschemas abhängig von Aktivität und Ausgabemodus.

Mit GIT_REFLOG_ACTION können Sie den beschreibenden Text angeben, der in das Reflog geschrieben wird. Hier ein Beispiel:

$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'My message'
[master 9e3d55a] My message
$ git reflog -1
9e3d55a HEAD@{0}: my action: My message