Frage Wie behandelt Git symbolische Links?


Wenn ich eine Datei oder ein Verzeichnis habe, das ein symbolischer Link ist, und ich es an einen Git Repo festlege, was passiert damit?

Ich würde annehmen, dass es es als eine symbolische Verbindung verlässt, bis die Datei gelöscht wird, und wenn Sie dann 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? Verpflichtet es gerade den baumelnden Link?


1314
2018-06-05 06:53


Ursprung


Antworten:


git speichert den Inhalt des Links (d. h. den Pfad des Dateisystemobjekts, mit dem er verknüpft ist) in einem "Blob", genau wie bei einer normalen Datei. Es speichert dann den Namen, den Modus und den Typ (einschließlich der Tatsache, dass es sich um einen Symlink handelt) in dem Baumobjekt, das sein enthaltendes Verzeichnis darstellt.

Wenn Sie einen Baum mit dem Link auschecken, wird das Objekt als Symlink wiederhergestellt, unabhängig davon, ob das Ziel-Dateisystemobjekt vorhanden ist oder nicht.

Wenn Sie die Datei löschen, auf die der Symlink verweist, hat dies keinerlei Auswirkungen auf den git-gesteuerten Symlink. Sie werden eine hängende Referenz haben. Es liegt an dem Benutzer, den Link entweder zu entfernen oder zu ändern, um bei Bedarf auf etwas Gültiges hinzuweisen.


1096
2018-06-05 07:01



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


Sie können herausfinden, was Git mit einer Datei macht, indem Sie sehen, was es tut, wenn Sie es zum Index hinzufügen. Der Index ist wie ein Pre-Commit. Mit dem festgeschriebenen Index können Sie verwenden git checkout um alles, was im Index war, wieder in das Arbeitsverzeichnis zu bringen. Was macht Git, wenn Sie dem Index einen symbolischen Link hinzufügen?

Um herauszufinden, machen Sie zuerst einen symbolischen Link:

$ ln -s /Path/referenced/by/symlink symlink

Git kennt diese Datei noch nicht. git ls-files können Sie Ihren Index überprüfen (-s Drucke statähnliche Ausgabe):

$ git ls-files -s ./symlink
$

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 den Inhalt im Git-Objektspeicher.

$ git add ./symlink

Also, was wurde hinzugefügt?

$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0       symlink
$

Der Hash ist eine Referenz auf das gepackte Objekt, das im Git-Objektspeicher erstellt wurde. Sie können dieses Objekt untersuchen, wenn Sie hineinschauen .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c.

Das 120000 ist der Dateimodus. Es wäre so etwas wie 100644 für eine normale Datei und ist der Modus speziell für Links. Von man git-config:

core.symlinks

Bei false werden symbolische Links als kleine einfache Dateien ausgecheckt, die den Linktext enthalten. git-update-index (1) und git-add (1) ändern den aufgezeichneten Typ nicht in reguläre Dateien.

Benutzen git cat-file -p um den Inhalt schön auszudrucken:

$ git cat-file -p 1596f9db1
/Path/referenced/by/symlink

Also, das ist es, was Git mit einem symbolischen Link macht: wenn du git checkout Bei der symbolischen Verknüpfung erhalten Sie je nach Konfiguration entweder eine Textdatei mit einem Verweis auf einen vollständigen Dateisystempfad oder einen Symlink. Die vom Symlink referenzierten Daten werden nicht im Repository gespeichert.


151
2017-09-13 17:06



Symlinked Verzeichnisse:

Es ist wichtig zu beachten, was passiert, wenn es ein Verzeichnis gibt, das eine weiche Verbindung ist. Jeder Git-Pull mit einem Update entfernt den Link und macht es zu einem normalen Verzeichnis. Das habe ich hart gelernt. Einige Einblicke Hier und Hier.

Beispiel

Vor

 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 ziehen und einige Updates gefunden

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

139
2017-10-02 06:16