Was ist der richtige Weg, um mit Symlinks in Git umzugehen?
Ich habe folgende Struktur:
Vendors
Module A
Module B
Module C
App
Code
Modules
Core Module 1
Core Module 2
Module A (symlinked to vendors)
Module B (symlinked to vendors)
Module C (symlinked to vendors)
Es gibt ein Haupt-App-Verzeichnis, das den gesamten Kerncode der Anwendung enthält. Zusätzlich gibt es ein Herstellerverzeichnis, das Module enthält, die mit dem Haupt-App-Verzeichnis verknüpft und daher integriert werden.
Wichtig ist, dass sowohl das Herstellerverzeichnis als auch das Haupt-App-Verzeichnis im selben Repository versioniert sind.
Sollte ich git daher weiterhin die Symlinks speichern lassen oder einen Weg finden, Symlinks ignorieren zu lassen?
Antworten:
Git kann mit Symlinks gut umgehen, solange das von allen Entwicklern verwendete Betriebssystem sie unterstützt. Da Sie darauf angewiesen sind, dass diese Symlinks vorhanden sind, gehe ich davon aus, dass Ihre Entwicklungsumgebungen alle Symlinks unterstützen.
Beachten Sie Folgendes, um zu entscheiden, ob etwas in Ihr Git-Repository aufgenommen werden soll oder nicht (Symlink oder auf andere Weise):
In Ihrem Fall scheinen die Symlinks nicht generiert zu werden und werden in allen Umgebungen benötigt. Daher sollte es in Ordnung sein, sie in das Repository zu stellen.
Wenn Sie sie erstellen, müssen Sie sie jedoch als relative Symlinks und nicht als absolute Symlinks erstellen, damit sie unabhängig davon funktionieren, wo das Repository geklont wird. Der einfachste Weg, dies zu tun, besteht darin, das Verzeichnis in das Modulverzeichnis zu ändern und von dort aus den Symlink zu erstellen:
quelle
-r
Option, um relative Symlinks zu erstellenln -r -s /path/to/target
symlinks = false
. Dies kann passieren, wenn Sie ein Repository von Windows oder mit TortiseGit kopiert haben.Git speichert den Symlink wie jede andere Datei in seiner Versionskontrolle - mit Ausnahme eines Symlinks werden nur die Informationen über den Pfad, mit dem die Symlinks verknüpft sind, und der Dateityp als Symlink anstelle einer regulären Datei gespeichert.
Wenn der Symlink auf ein Verzeichnis verweist, speichert git den Inhalt nicht unter dem Symlink-Verzeichnis.
Es sollte also nicht schaden, Symlinks zu speichern, die für Ihren Fall unter git versioniert wurden.
Eine weitere Sache, die Sie bei Symlinks beachten müssen, ist, dass git nur die Symlinks auf einem neuen Klon neu erstellt, nicht die Datei oder das Verzeichnis, auf die es verweist. Es besteht die Möglichkeit, dass der symlinked Pfad nicht vorhanden ist (z. B. bei Verwendung absoluter Pfade).
quelle
git submodules
(oder bessergit subtrees
).@Tuxdude Kann dir überhaupt nicht zustimmen mit "... dann machst du etwas falsch". Wenn Sie beispielsweise einen Medienordner auf einem anderen Laufwerk auf dem Webserver oder sogar auf einem NFS ablegen müssen, müssen Sie ihn außerhalb der Versionskontrolle ablegen. Daher ist der Inhalt des Ordners für verknüpfte Medien nicht wie von Ihnen erläutert durch Versionsverwaltung zugänglich. Aber das ist ein Szenario, in dem man es so machen muss. Und es ist wirklich ein Schmerz in der b ... Mein Szenario ist noch komplexer (ich werde nicht ins Detail gehen), was ich eigentlich suche, ist, die Unterordner des verknüpften Ordners zur Versionierung hinzuzufügen, aber nicht dessen Inhalt, aber Ich brauche eine Option, bei der ich alle Änderungen des Unterordnertyps selbst in Git ignorieren kann. Als Beispiel die Grundstruktur:
Ich brauche diese Ordner in der Git-Versionierung ohne deren Inhalt.
Auf dem Webserver (gleiche Versionierung) sehen diese Ordner folgendermaßen aus (Symlinks):
Die Entwickler sollten in ihrer lokalen Umgebung nur die ursprünglich versionierte Struktur haben, wie im ersten Schritt erläutert (keine Symlinks). Der Webserver verfügt jedoch über Symlinks zu verschiedenen NFS-Systemen.
Wenn jemand eine Idee hat, wie man das löst, würde ich es wirklich schätzen, weil ich noch keine Lösung dafür gefunden habe.
Die einzige Möglichkeit, die ich jetzt mache, besteht darin, einen Builder zu haben, der die richtige / unterschiedliche Struktur für lokale Umgebungen erstellt, und die Server und Medienunterordner werden derzeit von gitignore vollständig ignoriert. Aber das kann manchmal schwierig / schwer zu pflegen sein.
quelle
git clone
. Fügen Sie das Initialisierungsskript zur Versionskontrolle von git hinzu. BTWgit
wird keine leeren Verzeichnisse versionieren, git nur Versionsdateien und kennt den Pfad. Dies wird verwendet, um die Verzeichnisstruktur neu zu erstellen, wenn Sie einen dergit
Befehle ausführen.