Frage

Soll ich am besten ein Shell-Skript verwenden, das Symlinks durch Kopien ersetzt, oder gibt es eine andere Möglichkeit, Git anzuweisen, Symlinks zu folgen?

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

War es hilfreich?

Lösung

Hinweis: Dieser Rat ist jetzt veraltet wie pro Kommentar seit Git 1.6.1. Git verwendet, um dieses so zu verhalten, und nicht mehr der Fall ist.


Git durch Standardversuche Symlinks zu speichern, anstatt sie zu folgenden (für Kompaktheit, und es ist in der Regel, was die Leute wollen).

Allerdings habe ich geschafft, aus Versehen, um es Dateien über den Symlink hinzuzufügen, wenn der Symlink ein Verzeichnis ist.

D.h.:.

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

, indem Sie

 git add /bar/foo/baz

es schien zu funktionieren, wenn ich es versucht. Dieses Verhalten war jedoch unerwünscht von mir zu der Zeit, so kann ich Ihnen keine Informationen darüber hinaus geben.

Andere Tipps

Was ich tat, hinzufügen, um die Dateien in einem Symlink in Git zu bekommen (ich habe nicht einen symbolischen Link verwenden, aber):

sudo mount --bind SOURCEDIRECTORY TARGETDIRECTORY

Haben Sie diesen Befehl im Git-Managed-Verzeichnis. TARGETDIRECTORY erstellt werden muss, bevor die SOURCEDIRECTORY hinein montiert ist.

Es funktioniert unter Linux, aber nicht auf OS X! Das Trick half mir mit zu Subversion. Ich benutze es, Dateien von einem Dropbox-Konto zu schließen, wo ein webdesigner seine / ihre Sachen tut.

Warum nicht in die andere Richtung Symlinks um? anstelle von Bedeutung aus dem Git-Repository in das Anwendungsverzeichnis verknüpfen, nur in die andere Richtung verknüpft um.

Zum Beispiel, sagen wir, ich bin die Einrichtung einer Anwendung in ~/application installiert up, die eine Konfigurationsdatei config.conf benötigt:

  • Ich füge config.conf meine Git-Repository, zum Beispiel bei ~/repos/application/config.conf.
  • Dann erstelle ich einen Symlink von ~/application von ln -s ~/repos/application/config.conf ausgeführt wird.

Dieser Ansatz könnte nicht immer, aber es funktioniert gut für mich so weit.

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

Auf macOS (vor 10.13 High Sierra)

Wenn Sie bereits git und Xcode installiert, installieren Hardlink . Es ist ein mikroskopisches Tool erstellen harte Links .

die feste Verbindung zu erstellen, einfach:

hln source destination

macOS High Sierra Update

  

Hat Apple File-System-Unterstützung Verzeichnis harte Links?

     

Verzeichnis Hard-Links sind nicht von Apple File System unterstützt. Alle Verzeichnisse harte Links auf symbolische Verbindungen oder Aliasnamen umgewandelt werden, wenn Sie von HFS + zu APFS Volumen Formate auf macOS konvertieren.

     

APFs FAQ auf Entwickler .apple.com

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

Unter Linux und anderen Unix-Varianten

Der ln Befehl kann harte Links machen:

ln source destination

Unter Windows (Vista, 7, 8, ...)

Jemand schlug vor, verwenden mklink eine Kreuzung auf Windows erstellen, aber ich habe es nicht versucht :

mklink /j "source" "destination"

Dies ist ein pre-commit Haken die ersetzt die Symlink Blobs im Index, mit dem Inhalt dieser symbolischen Links.

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

#!/bin/sh
# (replace "find ." with "find ./<path>" 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

Notizen

Wir verwenden POSIX-konforme Funktionalität so weit wie möglich; jedoch diff -a nicht konform POSIX, möglicherweise unter anderem.

Es kann einige Fehler / Fehler in diesem Code sein, auch wenn es ein wenig getestet wurde.

Ich benutzte Dateien über symbolische Links hinzufügen nun schon seit geraumer Zeit. Dies war früher nur funktionieren, ohne besondere Vorkehrungen zu treffen. Da ich 1.6.1 Git aktualisiert, ist diese nicht mehr funktionieren.

Unter Umständen können Sie auf Git 1.6.0 wechseln, diese Arbeit zu machen. Ich hoffe, dass eine zukünftige Version von Git einen Flag zu git-add hat so dass sie wieder Symlinks folgen.

Ich habe genug von jeder Lösung, die hier entweder zu sein veraltet oder erfordern root, so Ich machte eine LD_PRELOAD-basierte Lösung (nur Linux).

Es hakt in Git Interna, überschreibt die ‚das ist ein symbolischer Link?‘ Funktion, so dass Symlinks als deren Inhalte behandelt werden. Standardmäßig werden alle auf Links außerhalb des Repo sind inlined; siehe den Link für weitere Informationen.

Mit Git 2.3.2+ (Q1 2015) gibt es einen weiteren Fall, in dem Git dies tun wird nicht Folgen Sie dem Symlink nicht mehr:sehen Commit e0d201b von Junio ​​C Hamano (gitster) (Haupt-Git-Betreuer)

apply:Berühren Sie keine Datei, die über einen symbolischen Link hinausgeht

Da Git symbolische Links als symbolische Links verfolgt, ist ein Pfad, der in seinem führenden Teil einen symbolischen Link enthält (z. B. path/to/dir/file, Wo path/to/dir ist ein symbolischer Link zu einer anderen Stelle, sei es innerhalb oder außerhalb des Arbeitsbaums) kann niemals in einem Patch erscheinen, der gültig gilt, es sei denn, derselbe Patch entfernt zuerst den symbolischen Link, um dort die Erstellung eines Verzeichnisses zu ermöglichen.

Einen solchen Patch erkennen und ablehnen.

Ähnlich verhält es sich, wenn eine Eingabe einen symbolischen Link erstellt path/to/dir und erstellt dann eine Datei path/to/dir/file, müssen wir es als Fehler kennzeichnen, ohne es tatsächlich zu erstellen path/to/dir symbolischer Link im Dateisystem.

Stattdessen gilt für jeden Patch in der Eingabe, der einen Pfad hinterlässt (d. h.eine Nichtlöschung) im Ergebnis vergleichen wir alle führenden Pfade mit dem resultierenden Baum, den der Patch erstellen würde, indem wir alle Patches in der Eingabe und dann das Ziel der Patch-Anwendung (entweder den Index oder den Arbeitsbaum) überprüfen.

Auf diese Weise:

  • Erkennen Sie einen Unfug oder einen Fehler beim Hinzufügen eines symbolischen Links path/to/dir und eine Datei path/to/dir/file gleichzeitig,
  • während ein gültiger Patch zugelassen wird, der ein Symbol entfernt link path/to/dir und fügt dann eine Datei hinzu path/to/dir/file.

Das bedeutet, dass es sich in diesem Fall nicht um eine generische Fehlermeldung handelt "%s: patch does not apply", aber eine spezifischere:

affected file '%s' is beyond a symbolic link

Hmmm, mount --bind scheint nicht auf Darwin zu arbeiten.

Hat jemand einen Trick hat, das tut?

[editiert]

OK, fand ich die Antwort auf Mac OS X ist eine Verknüpfung zu machen. Abgesehen davon, dass die API über ln nicht ausgesetzt sind, so müssen Sie Ihr eigenes kleines Programm, dies zu tun. Hier ist ein Link zu diesem Programm:

Hardlinks in Mac OS X Erstellen Verzeichnis

Genießen Sie!

Auf MacOS (ich habe Mojave / 10.14, git Version 2.7.1), bindfs verwenden.

brew install bindfs

cd /path/to/git_controlled_dir

mkdir local_copy_dir

bindfs <source_dir> local_copy_dir

Es wurde von anderen Kommentaren angedeutet, aber nicht eindeutig in anderen Antworten zur Verfügung gestellt. Hoffentlich spart dies einige Zeit jemand.

Ich verwende Git 1.5.4.3 und es ist nach dem übergeben Symlink, wenn es einen Schrägstrich hat. Z.

# Adds the symlink itself
$ git add symlink

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

Die Umrechnung von Symlinks könnte nützlich sein. Link in einem Git-Ordner anstelle eines symbolischen Link durch ein Skript .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top