Gibt es ein Problem bei der Verwendung von Hardlinks, da Git keine symbolischen Links erkennt, die außerhalb des Repositorys verweisen?
Könnte Git sie brechen? Können Sie mich bitte auf detaillierte Informationen hinweisen?
Gibt es ein Problem bei der Verwendung von Hardlinks, da Git keine symbolischen Links erkennt, die außerhalb des Repositorys verweisen?
Könnte Git sie brechen? Können Sie mich bitte auf detaillierte Informationen hinweisen?
Antworten:
Das 'tree'-Objekt, das Verzeichnisse in Git darstellt, speichert den Dateinamen und (Teilmengen von) Berechtigungen. Es speichert keine Inode-Nummer (oder eine andere Art von Datei-ID). Daher können Hardlinks in git nicht dargestellt werden , zumindest nicht ohne Tools von Drittanbietern wie Metastore oder Git-Cache-Meta (und ich bin mir nicht sicher, ob dies auch mit diesen Tools möglich ist).
Git versucht, keine Dateien zu berühren, die nicht aktualisiert werden müssen, aber Sie müssen berücksichtigen, dass git nicht versucht, Hardlinks beizubehalten, damit sie von git beschädigt werden können.
Über symbolische Links, die außerhalb des Repositorys verweisen : git hat keine Probleme damit und sollte den Inhalt symbolischer Links beibehalten ... aber die Nützlichkeit solcher Links ist für mich zweifelhaft, da es vom Dateisystemlayout außerhalb des git-Repositorys abhängt, ob diese Symlinks beschädigt werden oder nicht und nicht unter der Kontrolle von Git.
Ich habe herausgefunden, dass Sie mithilfe von Hooks das git pull
Ereignis erfassen können (wenn etwas zu ziehen ist ...), indem Sie den Skript-Ereignishandler in schreiben.git/hooks/post-merge
Datei .
Zuerst musst du chmod +x
tun.
Dann setzen Sie die ln
Befehle ein, um bei jedem Zug harte Links wiederherzustellen. Ordentlich huh!
Es funktioniert, ich brauchte das nur für mein Projekt und ls -i
zeigt, dass Dateien danach automatisch verknüpft wurden pull
.
Mein Beispiel für .git/hooks/post-merge
:
#!/bin/sh
ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf
WICHTIG: Wie Sie sehen können, sollte der Pfad zu einer beliebigen Datei in Ihrem Repository mit beginnen $GIT_DIR
und dann den partiellen relativen Pfad zur Datei hinzufügen.
Ebenfalls wichtig: -f
ist notwendig, da Sie die Zieldatei neu erstellen.
Von diesem msysgit Problem
Knotenpunkte sind keine symbolischen Verknüpfungen. Daher werden symbolische Links in msysGit einfach nicht unterstützt.
Außerdem wurden harte Links von Git nie verfolgt .
Das Problem war Windows-orientiert (da es sich um msysgit handelt) und die Debatte über die mögliche Unterstützung von Symlink.
Aber der Kommentar zu Hardlink betrifft Git im Allgemeinen.
Google 'git Hard Links bewahren' und es zeigt, dass Git nicht weiß, wie man die Hard Link Struktur AFAIK bewahrt, vielleicht von Natur aus.
Meine Webprojekte verwenden Hardlinks wie folgt:
www/products/index.php
www/products/dell_latitude_id577/index.php #(hard linked to above)
www/products/dell_inspiron_id323/index.php #(hard linked again to above)
me@server:www/products$ ls -l index.php
-rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
Wenn ich Änderungen an index.php vornehmen wollte, ändere ich sie an einer Stelle und die Hardlinks (Produktdetailseiten) verweisen auf die Änderungen - außer, dass git diese Beziehung beim Klonen und Abrufen auf anderen Computern nicht beibehält.
me@server:www$ git pull
Auf einem anderen Computer wird für jede feste Verbindung eine neue index.php erstellt.
hardlink --ignore-time
auf /var/lib/jenkins
, um etwas Speicherplatz zurück. Tagsüber werden einige Dateien nach git pull
oder wieder nicht mehr verknüpft, mvn compile
aber das ist in Ordnung , ich gehe davon aus, dass dies passieren wird. Wenn git harte Links beibehalten würde, würde meine Strategie zum Recycling von Speicherplatz nicht funktionieren.