Sie können herausfinden, was Git mit einer Datei macht, indem Sie sehen, was Git macht, wenn Sie sie dem Index hinzufügen. Der Index ist wie ein Pre-Commit. Mit dem festgeschriebenen Index können Sie git checkout
alles, was sich im Index befand, wieder in das Arbeitsverzeichnis bringen. Was macht Git, wenn Sie dem Index einen symbolischen Link hinzufügen?
Um dies herauszufinden, stellen Sie zunächst einen symbolischen Link her:
$ ln -s /path/referenced/by/symlink symlink
Git weiß noch nichts über diese Datei. git ls-files
können Sie Ihren Index (inspizieren -s
druckt stat
-ähnlichen Ausgabe):
$ git ls-files -s ./symlink
[nothing]
Fügen Sie nun den Inhalt des symbolischen Links zum Git-Objektspeicher hinzu, indem Sie ihn dem Index hinzufügen. Wenn Sie dem Index eine Datei hinzufügen, speichert Git deren Inhalt im Git-Objektspeicher.
$ git add ./symlink
Also, was wurde hinzugefügt?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Der Hash ist ein Verweis auf das gepackte Objekt, das im Git-Objektspeicher erstellt wurde. Sie können dieses Objekt untersuchen, wenn Sie .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
im Stammverzeichnis Ihres Repositorys nachsehen . Dies ist die Datei, die Git im Repository speichert und die Sie später auschecken können. Wenn Sie diese Datei untersuchen, werden Sie feststellen, dass sie sehr klein ist. Der Inhalt der verknüpften Datei wird nicht gespeichert.
(Hinweis 120000
ist der in der ls-files
Ausgabe aufgeführte Modus. Dies entspricht in etwa 100644
einer normalen Datei.)
Aber was macht Git mit diesem Objekt, wenn Sie es aus dem Repository in Ihr Dateisystem auschecken? Das hängt von der core.symlinks
Konfiguration ab. Von man git-config
:
core.symlinks
Wenn false, werden symbolische Links als kleine einfache Dateien ausgecheckt, die den Linktext enthalten.
Bei einem symbolischen Link im Repository erhalten Sie beim Auschecken entweder eine Textdatei mit einem Verweis auf einen vollständigen Dateisystempfad oder einen geeigneten symbolischen Link, abhängig vom Wert der core.symlinks
Konfiguration.
In beiden Fällen werden die Daten, auf die der Symlink verweist, nicht im Repository gespeichert.
.gitignore
sieht den Symlink als eine Datei, nicht als einen Ordner.