Wie kann ich Git Symlinks folgen?

Ich hatte ein Google, wie man das macht, hatte aber kein Glück.

Ist mein bestes ein Shell-Skript, das Symlinks durch Kopien ersetzt, oder gibt es eine andere Möglichkeit, Git zu folgen, um Symlinks zu folgen?

PS: Ich weiß, dass es nicht sehr sicher ist, aber ich möchte es nur in einigen speziellen Fällen tun.

    HINWEIS: Dieser Rat ist jetzt seit Kommentar seit git 1.6.1 veraltet. Git hat sich so verhalten und tut es nicht mehr.


    Git versucht standardmäßig, Symlinks zu speichern, anstatt ihnen zu folgen (für Kompaktheit, und es ist im Allgemeinen, was Leute wollen)

    Ich habe es jedoch versehentlich geschafft, Dateien jenseits des Symlinks hinzuzufügen, wenn der Symlink ein Verzeichnis ist.

    zB:

      /foo/ /foo/baz /bar/foo --> /foo /bar/foo/baz 

    indem du es tust

      git add /bar/foo/baz 

    es schien zu funktionieren, als ich es versuchte, dieses Verhalten war jedoch zu der Zeit von mir unerwünscht, also kann ich dir darüber hinaus keine Informationen geben.

    Was ich hinzugefügt habe, um die Dateien innerhalb eines Symlinks in git zu bekommen (ich habe keinen Symlink verwendet):

     sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY 

    Führen Sie diesen Befehl im verwalteten git-Verzeichnis aus. TARGETDIRECTORY muss erstellt werden, bevor das SOURCEDIRECTORY in es SOURCEDIRECTORY wird.

    functioniert gut unter Linux, aber nicht unter OS X! Dieser Trick half mir auch mit Subversion. Ich benutze es, um Dateien aus einem Dropbox-Account aufzunehmen, wo ein Webdesigner seine Sachen macht.

    Warum nicht Symlinks anders herum erstellen? Bedeutung, anstatt vom Git-Repository zum Anwendungsverzeichnis zu verlinken, einfach umgekehrt verlinken.

    ZB sagen wir, dass ich eine Anwendung installiere, die in ~/application installiert ist und eine Konfigurationsdatei config.conf

    • Ich füge config.conf meinem git-Repository hinzu, zB in ~/repos/application/config.conf
    • dann erstelle ich einen Symlink von ~/application indem ich ln -s ~/repos/application/config.conf

    Dieser Ansatz funktioniert möglicherweise nicht immer, hat aber bisher gut funktioniert.

    Verwenden Sie stattdessen feste Links. Dies unterscheidet sich von einem weichen (symbolischen) Link. Alle Programme, einschließlich git , behandeln die Datei als normale Datei. Beachten Sie, dass der Inhalt geändert werden kann, indem Sie entweder die Quelle oder das Ziel ändern.

    Auf macOS (vor 10.13 High Sierra)

    Wenn Sie bereits git und Xcode installiert haben, installieren Sie hardlink . Es ist ein mikroskopisches Werkzeug, um harte Links zu erstellen .

    Um die feste Verbindung zu erstellen, einfach:

     hln source destination 

    macOS High Sierra Update

    Unterstützt Apple File System Verzeichnis Hardlinks?

    Hardlinks für Verzeichnisse werden von Apple File System nicht unterstützt. Alle Verzeichnis-Hardlinks werden bei der Konvertierung von HFS + zu APFS-Volume-Formaten auf Mac OS in symbolische Links oder Aliase konvertiert.

    Von APFS FAQ auf developer.apple.com

    Folgen Sie https://github.com/selkhateeb/hardlink/issues/31 für zukünftige Alternativen.

    Auf Linux und anderen Unix-Varianten

    Der ln Befehl kann harte Links erzeugen:

     ln source destination 

    Unter Windows (Vista, 7, 8, …)

    Jemand schlug vor, mit mklink eine Junction unter Windows zu erstellen, aber ich habe es nicht versucht:

     mklink /j "source" "destination" 

    Dies ist ein Pre-Commit-Hook, der die Symlink-Blobs im Index durch den Inhalt dieser Symlinks ersetzt.

    Setzen Sie dies in .git/hooks/pre-commit und machen Sie es ausführbar:

     #!/bin/sh # (replace "find ." with "find ./" below, to work with only specific paths) # (these lines are really all one line, on multiple lines for clarity) # ...find symlinks which do not dereference to directories... find . -type l -exec test '!' -d {} ';' -print -exec sh -c \ # ...remove the symlink blob, and add the content diff, to the index/cache 'git rm --cached "$1"; diff -au /dev/null "$1" | git apply --cached -p1 -' \ # ...and call out to "sh". "process_links_to_nondir" {} ';' # the end 

    Anmerkungen

    Wir verwenden POSIX-kompatible functionen so weit wie möglich; diff -a ist jedoch unter Umständen nicht POSIX-konform.

    Dieser Code könnte einige Fehler enthalten, obwohl er etwas getestet wurde.

    Ich habe seit einiger Zeit Dateien über Symlinks hinaus hinzugefügt. Das funktionierte früher gut, ohne besondere Vorkehrungen zu treffen. Seit ich auf git 1.6.1 aktualisiert habe, funktioniert das nicht mehr.

    Sie können möglicherweise zu git 1.6.0 wechseln, damit dies funktioniert. Ich hoffe, dass eine zukünftige Version von git eine Markierung zum git-add haben wird, die es ermöglicht, Symlinks wieder zu folgen.

    Mit Git 2.3.2+ (Q1 2015) gibt es einen weiteren Fall, in dem Git dem Symlink nicht mehr folgen wird: siehe commit e0d201b von Junio ​​C Hamano ( gitster ) ( gitster Betreuer)

    apply : Berühren Sie keine Datei über einen symbolischen Link hinaus

    Weil Git symbolische Links als symbolische Links verfolgt, einen Pfad, der in seinem führenden Teil eine symbolische Verbindung hat (zB path/to/dir/file , wobei path/to/dir ein symbolischer Link zu einem anderen Ort ist, sei es innerhalb oder außerhalb der Arbeitsbaum) kann niemals in einem Patch erscheinen, der gültig angewendet wird, es sei denn, derselbe Patch entfernt zuerst den symbolischen Link, um dort ein Verzeichnis erstellen zu können.

    Erkennen und vercasting Sie einen solchen Patch.

    Wenn eine Eingabe einen symbolischen Verbindungspfad path/to/dir und dann einen Dateipfad path/to/dir/file , müssen wir ihn als Fehler kennzeichnen, ohne tatsächlich eine symbolische Verbindung path/to/dir im Dateisystem path/to/dir/file erstellen.

    Stattdessen überprüfen wir für jeden Patch in der Eingabe, der einen Pfad (dh eine Nicht-Löschung) im Ergebnis zurücklässt, alle führenden Pfade gegen den resultierenden Baum, den der Patch erzeugen würde, indem alle Patches in der Eingabe und dann das Ziel von Patch untersucht werden Anwendung (entweder der Index oder der Arbeitsbaum).

    So, wir:

    • einen Fehler oder einen Fehler finden, um gleichzeitig einen symbolischen Linkpfad path/to/dir und einen Dateipfad path/to/dir/file hinzuzufügen,
    • während ein gültiger Patch erlaubt wird, der einen symbolischen link path/to/dir und dann einen Dateipfad path/to/dir/file hinzufügt.

    Das heißt, in diesem Fall ist die Fehlermeldung keine generische Fehlermeldung wie "%s: patch does not apply" , sondern eine spezifischere:

     affected file '%s' is beyond a symbolic link 

    hmmm mount –bind scheint nicht auf Darwin zu funktionieren.

    Hat jemand einen Trick, der das tut?

    [bearbeitet]

    OK, ich habe die Antwort auf OSX gefunden, um einen Hardlink zu erstellen. Abgesehen davon, dass diese API nicht über ln , müssen Sie dafür Ihr eigenes kleines Programm verwenden. Hier ist ein Link zu diesem Programm:

    Erstellen von Verzeichnis-Hardlinks in MacOS X?

    Genießen!

    Ich habe genug von jeder Lösung, die entweder veraltet ist oder Root benötigt, also habe ich eine LD_PRELOAD-basierte Lösung entwickelt .

    Ich benutze Git 1.5.4.3 und folgt dem übergebenen Symlink, wenn es einen Schrägstrich hat. Z.B

     # adds the symlink itself $ git add symlink # follows symlink and adds denoted directory's contents $ git add symlink/ 

    Die Konvertierung von Symlinks wäre sinnvoll? Verknüpfen Sie im git-Ordner stattdessen einen Symlink mit einem Skript