Git und harte Links

91

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?

Alfredo Palhares
quelle
2
Was versuchst du zu tun und warum? Ein fester Link unterscheidet sich nicht von einer normalen Datei. Wenn Sie jemals eine neue Version aus einem anderen Repository abrufen würden, würde diese diejenige überschreiben, die Sie hatten - was bringt es, auf etwas außerhalb des Repos zu verlinken?
Carl Norum
1
Git erkennt Symlinks, die auf einen Pfad außerhalb des Repositorys verweisen.
Mipadi
Kein Mipadi, der einzige Weg ist, die Dateien im Repo und die symjbolischen Links an ihrem "echten" Ort zu winken
Alfredo Palhares

Antworten:

84

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.

Jakub Narębski
quelle
4
Symlinks zu Pfaden außerhalb des Repos können hilfreich sein. Ich habe sie in Webanwendungen verwendet, um auf Datenbank- oder Mediendateien zu verweisen, die vom Repo nicht verfolgt werden. Auf diese Weise kann die Konfigurationsdatei der Webanwendung auf einen statischen Pfad verweisen, der tatsächliche Speicherort dieses Pfads kann jedoch zwischen lokaler Entwicklung und Serverumgebung variieren.
Mipadi
@mipadi: Übrigens. Das moderne Gitweb hat einen Sonderfall für die Anzeige von Symlinks, die nach der Normalisierung außerhalb des Repositorys führen.
Jakub Narębski
6
Ja, Symlinks außerhalb des Repos sind in Ordnung. Ich habe sie verwendet, um auf ein riesiges Datenverzeichnis zu verweisen, das ich nicht versioniert brauchte (oder wollte). Im Allgemeinen verwende ich relative Links. In einigen Fällen mussten das Repo und das Datenverzeichnis in einem übergeordneten Verzeichnis nebeneinander liegen. Sie können erstaunliche Tricks mit einem Symlink zu ../foo machen.
Adrian Ratnapala
Leider ist das Git-Repository für Metastore (git: //git.hardeman.nu/metastore.git) nicht mehr verfügbar.
Derek Mahar
1
github.com/danny0838/git-store-meta ist eine Alternative zu git-cache-meta .
Derek Mahar
21

Ich habe herausgefunden, dass Sie mithilfe von Hooks das git pullEreignis 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 -izeigt, 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: -fist notwendig, da Sie die Zieldatei neu erstellen.

Niloct
quelle
11
Es sieht also so aus, als müssten Sie jedes Mal, wenn Sie Ihrem Repo einen Hardlink hinzufügen, manuell eine Zeile zu Ihrem Post-Merge-Hook-Skript hinzufügen. Wäre schön, wenn Ihr Pre-Commit-Hook dies vollautomatisch machen würde - indem Sie harte (und symbolische) Links in Ihrem Commit erkennen und die entsprechenden Zeilen in Ihre Post-Merge-Datei schreiben. Git müsste keine Inode-Informationen im Repo speichern, sondern Teile davon in den Hooks! Aber was für ein Durcheinander, wenn die verknüpfte Datei in einem anderen Git-Repo verfolgt würde ... würde sich eine Bearbeitung der Datei an einer Stelle reibungslos auf das andere Repo übertragen? Perpetual verschmilzt mit einer kreisförmigen Push / Pull-Schleife?
Kochfelder
Cleverer Ansatz, aber es ist bedauerlich, dass Git keine Hardlinks verfolgt und diese möglicherweise sogar als Kopien auf Dateisystemen darstellt, die keine Hardlinks unterstützen.
Derek Mahar
8

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.

VonC
quelle
2

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.

xce_git
quelle
7
Sie sollten eine Art Routing in Ihrer Webanwendung implementieren. Harte Verknüpfung ist bizarr.
Nowaker
5
Ja, benutze zumindest Symlinks. :)
Andres Riofrio
2
Dies ist eigentlich das, was ich will, ich möchte nicht, dass Git harte Links bewahrt. Ich habe ein Jenkins-Verzeichnis mit Tonnen von Arbeitsbereichsverzeichnissen, und aufgrund von Mehrzweig-Pipelines gibt es viele Duplikate. Also habe ich einen nächtlichen Job haben , dass Läufe hardlink --ignore-timeauf /var/lib/jenkins, um etwas Speicherplatz zurück. Tagsüber werden einige Dateien nach git pulloder wieder nicht mehr verknüpft, mvn compileaber 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.
Amedee Van Gasse