Unsere Entwickler verwenden eine Mischung aus Windows- und Unix-basierten Betriebssystemen. Daher werden auf Unix-Computern erstellte Symlinks für Windows-Entwickler zu einem Problem. In Windows (msysgit) wird der Symlink in eine Textdatei mit einem Pfad zu der Datei konvertiert, auf die er verweist. Stattdessen möchte ich den Symlink in einen tatsächlichen Windows-Symlink konvertieren.
Die ( aktualisierte ) Lösung, die ich dafür habe, ist:
- Schreiben Sie ein Post-Checkout-Skript, das rekursiv nach "Symlink" -Textdateien sucht.
- Ersetzen Sie sie durch Windows Symlink (mit mklink) mit demselben Namen und derselben Erweiterung wie Dummy "Symlink".
- Ignorieren Sie diesen Windows-Symlink, indem Sie einen Eintrag in .git / info / exclude hinzufügen
Ich habe dies nicht implementiert, aber ich glaube, dass dies ein solider Ansatz für dieses Problem ist.
Fragen:
- Welche Nachteile sehen Sie bei diesem Ansatz, wenn überhaupt?
- Ist dieses Post-Checkout-Skript überhaupt implementierbar? dh kann ich rekursiv herausfinden, welche Dummy-Symlink-Dateien git erstellt?
- Hat jemand schon an einem solchen Skript gearbeitet?
Antworten:
Sie können die Symlinks finden, indem Sie nach Dateien suchen, die einen Modus haben
120000
, möglicherweise mit diesem Befehl:Sobald Sie die Links ersetzt haben, würde ich empfehlen, sie als unverändert zu markieren
git update-index --assume-unchanged
, anstatt sie in aufzulisten.git/info/exclude
.quelle
git ls-files -s | grep '^12' | cut -f2
(zweite durch Tabulatoren getrennte Spalte; andere Spalten sind durch Leerzeichen getrennt)for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Ich habe vor einiger Zeit genau dieselbe Frage gestellt (nicht hier, nur im Allgemeinen) und am Ende eine sehr ähnliche Lösung gefunden wie OP. Zuerst werde ich direkte Antworten auf die Fragen 1, 2 und 3 geben und dann die Lösung veröffentlichen, die ich letztendlich verwendet habe.
git checkout
Step, aber die unten stehende Lösung hat meine Anforderungen gut genug erfüllt, dass ein wörtliches Post-Checkout-Skript nicht erforderlich war.Die Lösung:
Unsere Entwickler befinden sich in einer ähnlichen Situation wie OPs: eine Mischung aus Windows- und Unix-ähnlichen Hosts, Repositorys und Submodulen mit vielen Git-Symlinks und (noch) keiner nativen Unterstützung in der Release-Version von MsysGit für den intelligenten Umgang mit diesen Symlinks auf Windows-Hosts .
Vielen Dank an Josh Lee für den Hinweis, dass git Symlinks mit einem speziellen Dateimodus festlegt
120000
. Mit diesen Informationen können einige Git-Aliase hinzugefügt werden, mit denen Git-Symlinks auf Windows-Hosts erstellt und bearbeitet werden können.Erstellen von Git-Symlinks unter Windows
Verwendung:
git add-symlink <source_file_or_dir> <target_symlink>
Dabei muss das der Quelldatei oder dem Quellverzeichnis entsprechende Argument die Form eines Pfads relativ zum Zielsymlink haben. Sie können diesen Alias genauso verwenden, wie Sie es normalerweise tun würdenln
.ZB der Repository-Baum:
Kann unter Windows wie folgt erstellt werden:
Ersetzen von Git-Symlinks durch NTFS-Hardlinks + Junctions
Verwendung:
Dieser Alias kann Git-Symlinks einzeln oder auf einmal auf einen Schlag entfernen. Symlinks werden durch NTFS-Hardlinks (bei Dateien) oder NTFS-Junctions (bei Verzeichnissen) ersetzt. Der Vorteil der Verwendung von Hardlinks + Junctions gegenüber "echten" NTFS-Symlinks besteht darin, dass keine erhöhten UAC-Berechtigungen erforderlich sind, damit sie erstellt werden können.
Um Symlinks aus Submodulen zu entfernen, verwenden Sie einfach die integrierte Unterstützung von git, um diese zu durchlaufen:
Aber für jede drastische Aktion wie diese ist eine Umkehrung schön ...
Wiederherstellen von Git-Symlinks unter Windows
Verwendung
git checkout-symlinks [symlink] [symlink] [...]
:, die rückgängig gemachtgit rm-symlinks
wird und das Repository effektiv in seinen natürlichen Zustand zurückversetzt (mit Ausnahme Ihrer Änderungen, die intakt bleiben sollten ).Und für Submodule:
Einschränkungen:
Verzeichnisse / Dateien / Symlinks mit Leerzeichen in ihren Pfaden sollten funktionieren. Aber Tabs oder Zeilenumbrüche? YMMV… (Damit meine ich: Tu das nicht, weil es nicht funktionieren wird.)
Wenn Sie oder andere dies vergessen,
git checkout-symlinks
bevor Sie etwas mit möglicherweise weitreichenden Konsequenzen wie tungit add -A
, kann das lokale Repository in einen verschmutzten Zustand geraten.Verwenden Sie unser "Beispiel-Repo" von zuvor:
Hoppla...
Aus diesem Grund ist es hilfreich, diese Aliase als Schritte einzuschließen, die Windows-Benutzer vor und nach dem Erstellen eines Projekts ausführen müssen, anstatt nach dem Auschecken oder vor dem Push. Aber jede Situation ist anders. Diese Aliase waren für mich so nützlich, dass eine echte Post-Checkout-Lösung nicht erforderlich war.
Hoffentlich hilft das!
Verweise:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Letzte Aktualisierung: 2019-03-13
mklink
Anrufen natürlich) - keine Bashisms mehr !add-symlink
Alias funktioniert jetzt eher wie ln (1) und kann von jedem Verzeichnis im Repository aus verwendet werden, nicht nur vom Stammverzeichnis des Repositorys.rm-symlink
Alias (Singular) wurde durch denrm-symlinks
Alias (Plural) ersetzt, der nun mehrere Argumente (oder überhaupt keine Argumente, die wie zuvor alle Symlinks im gesamten Repository finden) akzeptiert, um Git-Symlinks selektiv in NTFS-Hardlinks + Junctions umzuwandeln .checkout-symlinks
Alias wurde ebenfalls aktualisiert, um mehrere Argumente (oder gar keine, == alles) für die selektive Umkehrung der oben genannten Transformationen zu akzeptieren.Letzte Anmerkung: Während ich das Laden und Ausführen dieser Aliase mit Bash 3.2 (und sogar 3.1) für diejenigen getestet habe, die aus einer Reihe von Gründen immer noch an solchen alten Versionen hängen bleiben, sollten Sie sich darüber im Klaren sein, dass so alte Versionen für ihren Parser berüchtigt sind Fehler. Wenn beim Installieren eines dieser Aliase Probleme auftreten, sollten Sie zunächst die Aktualisierung Ihrer Shell prüfen (für Bash überprüfen Sie die Version mit STRG + X, STRG + V). Wenn Sie versuchen, sie durch Einfügen in Ihren Terminalemulator zu installieren, haben Sie möglicherweise mehr Glück, wenn Sie sie in eine Datei einfügen und stattdessen beschaffen, z. B. als
Viel Glück!
quelle
git add-symlink
Rezept war für mich fantastisch wertvoll. Danke vielmals.Die neueste Version von git scm (testet 2.11.1) ermöglicht das Aktivieren symbolischer Links. Sie müssen das Repository jedoch erneut mit den Symlinks klonen
git clone -c core.symlinks=true <URL>
. Sie müssen diesen Befehl mit Administratorrechten ausführen. Es ist auch möglich, Symlinks unter Windows mit mklink zu erstellen. Schauen Sie sich das Wiki an .quelle
tslint.json
Datei, die auf die Datei im übergeordneten Verzeichnis verweist, enthält noch../tslint.json
. Schade, denn dies sah wirklich nach der einfachsten aller dort vorgeschlagenen Lösungen aus.git clone -c core.symlinks=true <URL>
Und unter Windows müssen Sie es mit Administratorrechten ausführen.Es sollte in msysgit implementiert werden, aber es gibt zwei Nachteile:
Ich habe eine schnelle Suche durchgeführt und es wird aktiv daran gearbeitet, siehe Ausgabe 224 .
quelle
Da sich die Dinge mit GIT geändert haben, seit viele dieser Antworten hier veröffentlicht wurden, finden Sie hier die richtigen Anweisungen, damit Symlinks ab Windows ordnungsgemäß funktionieren
AUGUST 2018
1. Stellen Sie sicher, dass git mit Symlink-Unterstützung installiert ist
2. Weisen Sie Bash an, Hardlinks anstelle von Symlinks zu erstellen
EDIT - (Git-Ordner) /etc/bash.bashrc
UNTEN HINZUFÜGEN -
MSYS=winsymlinks:nativestrict
3. Stellen Sie git config so ein, dass Symlinks verwendet werden
oder
HINWEIS: Ich habe versucht, dies zur globalen Git-Konfiguration hinzuzufügen, und im Moment funktioniert es nicht für mich. Ich empfehle daher, dies jedem Repo hinzuzufügen ...
4. Ziehen Sie das Repo
HINWEIS: Sofern Sie den Entwicklermodus in der neuesten Version von Windows 10 nicht aktiviert haben, müssen Sie bash als Administrator ausführen, um Symlinks zu erstellen
5. Alle Symlinks zurücksetzen (optional) Wenn Sie ein vorhandenes Repo haben oder Submodule verwenden, werden die Symlinks möglicherweise nicht korrekt erstellt. Um alle Symlinks im Repo zu aktualisieren, können Sie diese Befehle ausführen.
HINWEIS: Dadurch werden alle Änderungen seit dem letzten Festschreiben zurückgesetzt. Stellen Sie daher sicher, dass Sie zuerst festgeschrieben haben
quelle
Kurze Antwort: Sie werden jetzt gut unterstützt, wenn Sie den Entwicklermodus aktivieren können.
Von https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
Bei allen anderen Ankündigungen des "Creator's Update" leicht zu übersehen, aber wenn Sie den Entwicklermodus aktivieren, können Sie Symlinks ohne erhöhte Berechtigungen erstellen. Möglicherweise müssen Sie git neu installieren und sicherstellen, dass die Symlink-Unterstützung aktiviert ist, da dies nicht standardmäßig der Fall ist.
quelle
gpedit.msc
->Local Computer Policy
->Computer Configuration
->Windows Settings
->Security Settings
->Local Policies
->User Rights Assignment
ist seit Jahrhunderten die kanonische Methode, Benutzerrechte wieSeCreateSymbolicLink
und Freunde zuzuweisen . Anders alsntrights.exe
aus dem Resource Kit oder der PowerShell ...2020 Antwort
mklink
Berechtigungengit config --global core.symlinks true
Durch das Wechseln der Zweige werden fehlende Symlinks neu erstellt.
Seien Sie vorsichtig, die Unterstützung für Symlinks unter Windows mit einigen anderen Git-Clients ist nicht vollständig. Insbesondere GitKraken.
quelle
Ich würde vorschlagen, dass Sie keine Symlinks innerhalb des Repos verwenden. Speichern Sie den eigentlichen Inhalt im Repo und platzieren Sie dann Symlinks außerhalb des Repos, die auf den Inhalt verweisen.
Nehmen wir also an, Sie verwenden ein Repo, um das Hosting Ihrer Website auf * nix mit dem Hosting auf win zu vergleichen. Speichern Sie den Inhalt in Ihrem Repo ', sagen wir,
/httpRepoContent
undc:\httpRepoContent
dies ist der Ordner, der über GIT, SVN usw. synchronisiert wird.Ersetzen Sie dann den Inhaltsordner Ihres Webservers (
/var/www
undc:\program files\web server\www
{Namen spielen keine Rolle, bearbeiten Sie sie, wenn Sie müssen}) durch einen symbolischen Link zum Inhalt Ihres Repos. Die Webserver sehen den Inhalt tatsächlich am "richtigen" Ort, aber Sie können Ihre Quellcodeverwaltung verwenden.Wenn Sie jedoch Symlinks mit im Repo 'verwenden müssen, müssen Sie sich mit so etwas wie Pre / Post-Commit-Skripten befassen. Ich weiß, dass Sie sie verwenden können, um Dinge zu tun, wie zum Beispiel Code-Dateien über einen Formatierer zu analysieren, sodass es möglich sein sollte, die Symlinks zwischen Plattformen zu konvertieren.
Wenn jemand einen guten Ort kennt, um zu lernen, wie man diese Skripte für die allgemeinen Quellcodeverwaltungen, SVN GIT MG, erstellt, fügen Sie bitte einen Kommentar hinzu.
quelle
Für Benutzer von CygWin unter Vista, Win7 oder höher kann der native
git
Befehl "richtige" Symlinks erstellen, die von Windows-Apps wie Android Studio erkannt werden . Sie müssen nur die festlegenCYGWIN
Umgebungsvariable enthaltenwinsymlinks:native
oderwinsymlinks:nativestrict
als solche:Der Nachteil (und ein wesentlicher) ist, dass die CygWin-Shell "Als Administrator ausführen" sein muss, damit sie über die zum Erstellen dieser Art von Symlinks erforderlichen Betriebssystemberechtigungen verfügt. Sobald sie erstellt wurden, sind jedoch keine besonderen Berechtigungen erforderlich, um sie zu verwenden . Solange sie nicht von einem anderen Entwickler im Repository geändert werden,
git
läuft sie anschließend mit normalen Benutzerberechtigungen einwandfrei.Persönlich verwende ich dies nur für Symlinks, die aufgrund dieser zusätzlichen Schwierigkeit von Windows-Apps (dh Nicht-CygWin) navigiert werden.
Weitere Informationen zu dieser Option finden Sie in dieser SO-Frage: Herstellen einer symbolischen Verknüpfung mit Cygwin in Windows 7
quelle
Hier ist ein Batch-Skript zum Konvertieren von Symlinks im Repository, nur für Dateien, basierend auf Josh Lees Antwort. Das Skript mit einigen zusätzlichen Überprüfungen der Administratorrechte finden Sie unter https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
quelle
Ich verwende ständig Sym-Links zwischen meinem Dokumentenstamm und dem Git-Repo-Verzeichnis. Ich mag es, sie getrennt zu halten. Unter Windows verwende ich die Option mklink / j. Die Kreuzung scheint zuzulassen, dass sich Git normal verhält:
>mklink /j <location(path) of link> <source of link>
beispielsweise:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
quelle
Ich suchte nach einer einfachen Lösung, um mit den symbolischen Unix-Links unter Windows umzugehen. Vielen Dank für die oben genannten Git-Aliase. Es gibt eine kleine Optimierung, die an den rm-symlinks vorgenommen werden kann, damit die Dateien im Zielordner nicht gelöscht werden, falls der Alias versehentlich ein zweites Mal ausgeführt wird. Beachten Sie die neue if-Bedingung in der Schleife, um sicherzustellen, dass die Datei noch kein Link zu einem Verzeichnis ist, bevor die Logik ausgeführt wird.
quelle
Ein einfacher Trick, den wir verwenden, besteht darin, einfach anzurufen
git add --all
zweimal hintereinander .Zum Beispiel ruft unser Windows 7-Festschreibungsskript Folgendes auf:
Beim ersten Hinzufügen wird der Link als Text behandelt und die zu löschenden Ordner werden hinzugefügt.
Das zweite Hinzufügen durchläuft den Link korrekt und macht das Löschen durch Wiederherstellen der Dateien rückgängig.
Es ist weniger elegant als einige der anderen vorgeschlagenen Lösungen, aber es ist eine einfache Lösung für einige unserer Legacy-Umgebungen, denen Symlinks hinzugefügt wurden.
quelle