Sie können sehen, was Git mit einem symbolischen Link macht, indem Sie ihn zum Index hinzufügen. Der Index ist wie ein Pre-Commit. Wenn der Index übertragen wird, können Sie mit git checkout
um alles, was sich im Index befand, wieder in das Arbeitsverzeichnis zu bringen. Was macht Git also, wenn Sie einen symbolischen Link zum Index hinzufügen?
Erstellen Sie zunächst 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
druckt stat
-ähnliche Ausgabe):
$ git ls-files -s ./symlink
[nothing]
Fügen Sie nun den symbolischen Link in den Index ein. Wenn Sie eine Datei zum Index hinzufügen, kopiert Git ihren Inhalt in den Objektspeicher.
$ git add ./symlink
Was wurde also hinzugefügt?
$ git ls-files -s ./symlink
120000 1596f9db1b9610f238b78dd168ae33faa2dec15c 0 symlink
Der Hash ist ein Verweis auf das gepackte Objekt, das im Objektspeicher erstellt wurde. Sie können dieses Objekt untersuchen, wenn Sie sich in .git/objects/15/96f9db1b9610f238b78dd168ae33faa2dec15c
im Stammverzeichnis Ihres Repositorys. Dies ist die Datei, die Git im Repository speichert und die Sie später auschecken können. Wenn Sie sich diese Datei ansehen, werden Sie feststellen, dass sie sehr klein ist. Sie speichert nicht den Inhalt der verknüpften Datei. Um dies zu bestätigen, drucken Sie den Inhalt des gepackten Repository-Objekts mit git cat-file
:
$ git cat-file -p 1596f9db1b9610f238b78dd168ae33faa2dec15c
/path/referenced/by/symlink
(Anmerkung 120000
ist der Modus, der in ls-files
Ausgabe. Sie würde etwa so aussehen 100644
für eine normale 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
Konfig. 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 also beim Auschecken entweder eine Textdatei mit einem Verweis auf einen vollständigen Dateisystempfad oder einen richtigen symbolischen Link, je nach dem Wert der Option core.symlinks
Konfiguration.
In beiden Fällen wird der Inhalt des Pfades, auf den der Symlink verweist, nicht im Repository gespeichert (es sei denn, der referenzierte Pfad ist également im Repository, natürlich).
32 Stimmen
.gitignore
sieht den Symlink als Datei und nicht als Ordner.12 Stimmen
Nun, offensichtlich steckt mehr hinter der Frage, als diese Antwort vermuten lässt. Ich frage mich zum Beispiel folgendes: Wenn ich in meinem Repository einen Sym-Link zu einer großen Datei in diesem Repository erstelle, die Änderungen veröffentliche und dann diese Änderungen auf einen anderen Rechner ziehe, was passiert dann? Wird die große Datei an beiden Orten als große Datei gespeichert, oder bleibt der Sym-Link erhalten, so dass auf dem neuen Rechner die Link-Datei auf die ursprüngliche große Datei verweist?
10 Stimmen
Dies ist ein altes Thema, aber dieser Kommentar ist vielleicht noch nützlich. Als Antwort auf jviesem: Ein Softlink ist im Grunde eine Datei mit dem Namen einer anderen Datei. Wenn Sie sie also auf einen anderen Rechner ziehen, wird der Link heruntergeladen und trägt den Namen der großen Datei auf dem ursprünglichen Dateisystem. Wenn der Name auf dem neuen Rechner nicht gültig ist, wird der Link einen ungültigen Namen haben. Die große Datei wird dann nicht auf den neuen Rechner heruntergeladen.
11 Stimmen
@lasaro, der Weg, um kaputte Links in einem Git Repo zu vermeiden, ist, immer relative Pfade zu verwenden, wenn man die Symlinks erstellt, indem man
../..
nach Bedarf.0 Stimmen
git add -f filename
zum Hinzufügen zu Git15 Stimmen
Beachten Sie, dass Sie in den meisten Windows-Versionen erweiterte Rechte benötigen, um einen Symlink zu erstellen. Wenn Sie unter Windows arbeiten und
git pull
eine Datei anstelle eines Symlinks erstellt, versuchen Sie, Ihren Git-Client als Administrator auszuführen.3 Stimmen
Informationen darüber, was Git unter Windows macht; stackoverflow.com/questions/11662868/
2 Stimmen
Für diejenigen, die Windows 10 verwenden, ist es vielleicht interessant zu wissen, dass durch die Aktivierung des Entwicklermodus die Einschränkung aufgehoben wird, ein Administrator (mit erweiterten Rechten) zu sein. Siehe den Microsoft-Artikel blogs.Windows.com/windowsdeveloper/2016/12/02/