it-swarm.com.de

Wie geht Git mit symbolischen Links um?

Was passiert damit, wenn ich eine Datei oder ein Verzeichnis habe, das ein symbolischer Link ist, und es einem Git-Repository übergebe?

Ich würde annehmen, dass es es als symbolische Verknüpfung belässt, bis die Datei gelöscht wird, und wenn Sie die Datei von einer alten Version zurückziehen, erstellt es nur eine normale Datei.

Was macht es, wenn ich die Datei lösche, auf die es verweist? Stellt es nur die baumelnde Verbindung her?

1480
Alex

Git speichert nur den Inhalt des Links (d. H. Den Pfad des Dateisystemobjekts, auf das er verweist) in einem "Blob", genau wie dies für eine normale Datei der Fall wäre. Anschließend werden Name, Modus und Typ (einschließlich der Tatsache, dass es sich um einen Symlink handelt) in dem Baumobjekt gespeichert, das das zugehörige Verzeichnis darstellt.

Wenn Sie einen Baum auschecken, der die Verknüpfung enthält, wird das Objekt als Symlink wiederhergestellt, unabhängig davon, ob das Zieldateisystemobjekt vorhanden ist oder nicht.

Wenn Sie die Datei löschen, auf die der Symlink verweist, hat dies keinerlei Auswirkungen auf den von Git gesteuerten Symlink. Sie haben eine baumelnde Referenz. Es liegt an dem Benutzer, den Link zu entfernen oder zu ändern, um auf etwas Gültiges zu verweisen, falls erforderlich.

1241
CB Bailey

TL; DR: Die vom Symlink referenzierten Daten werden nicht im Repository gespeichert.


Sie können herausfinden, wie Git mit einer Datei umgeht, wenn Sie sie dem Index hinzufügen. Der Index ist wie ein Pre-Commit. Wenn der Index festgeschrieben ist, können Sie _git checkout_ verwenden, um alles, was sich im Index befindet, wieder in das Arbeitsverzeichnis zu verschieben. Was macht Git also, 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 kennt diese Datei noch nicht. Mit _git ls-files_ können Sie Ihren Index überprüfen (_-s_ druckt stat- ähnliche Ausgabe):

_$ git ls-files -s ./symlink
[nothing]
_

Fügen Sie nun den Inhalt des symbolischen Links zum Git-Objektspeicher hinzu, indem Sie ihn zum Index hinzufügen. Wenn Sie dem Index eine Datei hinzufügen, speichert Git ihren 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, indem Sie in _.git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c_ im Stammverzeichnis Ihres Repository 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 Ausgabe von _ls-files_ aufgeführte Modus. Für eine reguläre Datei wäre dies etwa _100644_.)

Aber was macht Git mit diesem Objekt, wenn Sie es aus dem Repository in Ihr Dateisystem auschecken? Es 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.

Mit einem symbolischen Link im Repository erhalten Sie beim Auschecken entweder eine Textdatei mit einem Verweis auf einen vollständigen Dateisystempfad oder einen richtigen symbolischen Link, abhängig vom Wert der _core.symlinks_ -Konfiguration.

In beiden Fällen werden die vom Symlink referenzierten Daten nicht im Repository gespeichert.

213

Hinweis des Herausgebers: Dieser Beitrag enthält möglicherweise veraltete Informationen. Bitte beachten Sie die Kommentare und diese Frage zu Änderungen in Git seit 1.6.1.

Symlinked Directories:

Es ist wichtig zu beachten, was passiert, wenn es ein Verzeichnis gibt, das ein Softlink ist. Jeder Git-Pull mit einem Update entfernt den Link und macht es zu einem normalen Verzeichnis. Das habe ich auf harte Weise gelernt. Einige Einblicke hier und hier.

Beispiel

Vorher

_ ls -l
 lrwxrwxrwx 1 admin adm   29 Sep 30 15:28 src/somedir -> /mnt/somedir
_

git add/commit/Push

_It remains the same
_

Nach _git pull_ UND einige Updates gefunden

_ drwxrwsr-x 2 admin adm 4096 Oct  2 05:54 src/somedir
_
146
Shekhar