it-swarm.com.de

Git Symlinks in Windows

Unsere Entwickler verwenden eine Mischung aus Windows- und Unix-basierten Betriebssystemen. Auf Unix-Computern erstellte Symlinks werden daher zu einem Problem für Windows-Entwickler. 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 zu diesem 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 eine solide Herangehensweise an dieses Problem ist.

Fragen:

  1. Welche Nachteile sehen Sie für diesen Ansatz, wenn überhaupt?
  2. Ist dieses Post-Checkout-Skript überhaupt implementierbar? kann ich rekursiv herausfinden, welche Dummy-"Symlink" -Dateien git erstellt?
  3. Hat jemand schon an einem solchen Skript gearbeitet?
223
Ken Hirakawa

Sie können die Symlinks finden, indem Sie nach Dateien suchen, die den Modus 120000 Haben, möglicherweise mit folgendem Befehl:

git ls-files -s | awk '/120000/{print $4}'

Sobald Sie die Links ersetzt haben, würde ich empfehlen, sie als unverändert mit git update-index --assume-unchanged Zu markieren, anstatt sie in .git/info/exclude Aufzulisten.

95
Josh Lee

Ich habe genau diese Frage vor einiger Zeit gestellt (nicht hier, nur im Allgemeinen) und kam zu einer sehr ähnlichen Lösung wie OPs Vorschlag. Zuerst werde ich die Fragen 1, 2 und 3 direkt beantworten und dann die Lösung posten, die ich letztendlich verwendet habe.

  1. Es gibt in der Tat einige Nachteile der vorgeschlagenen Lösung, hauptsächlich in Bezug auf ein erhöhtes Potenzial für die Verschmutzung des Repositorys oder das versehentliche Hinzufügen doppelter Dateien, während sie sich in ihrem "Windows-Symlink" -Status befinden. (Mehr dazu unter "Einschränkungen" weiter unten.)
  2. Ja, ein Post-Checkout-Skript ist implementierbar! Vielleicht nicht als wörtlicher Post - git checkout - Schritt, aber die Lösung unten hat meine Anforderungen gut genug erfüllt, dass ein wörtliches Post-Checkout-Skript nicht erforderlich war.
  3. Ja!

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) keine native Unterstützung für die intelligente Verarbeitung dieser Symlinks auf Windows-Hosts in der Release-Version von MsysGit .

Vielen Dank an Josh Lee für den Hinweis, dass git Symlinks mit speziellem Dateimodus 120000 Festlegt. Mit diesen Informationen können einige Git-Aliase hinzugefügt werden, mit denen Git-Symlinks auf Windows-Hosts erstellt und bearbeitet werden können.

  1. Erstellen von Git-Symlinks unter Windows

    git config --global alias.add-symlink '!'"$(cat <<'ETX'
    __git_add_symlink() {
      if [ $# -ne 2 ] || [ "$1" = "-h" ]; then
        printf '%b\n' \
            'usage: git add-symlink <source_file_or_dir> <target_symlink>\n' \
            'Create a symlink in a git repository on a Windows Host.\n' \
            'Note: source MUST be a path relative to the location of target'
        [ "$1" = "-h" ] && return 0 || return 2
      fi
    
      source_file_or_dir=${1#./}
      source_file_or_dir=${source_file_or_dir%/}
    
      target_symlink=${2#./}
      target_symlink=${target_symlink%/}
      target_symlink="${GIT_PREFIX}${target_symlink}"
      target_symlink=${target_symlink%/.}
      : "${target_symlink:=.}"
    
      if [ -d "$target_symlink" ]; then
        target_symlink="${target_symlink%/}/${source_file_or_dir##*/}"
      fi
    
      case "$target_symlink" in
        (*/*) target_dir=${target_symlink%/*} ;;
        (*) target_dir=$GIT_PREFIX ;;
      esac
    
      target_dir=$(cd "$target_dir" && pwd)
    
      if [ ! -e "${target_dir}/${source_file_or_dir}" ]; then
        printf 'error: git-add-symlink: %s: No such file or directory\n' \
            "${target_dir}/${source_file_or_dir}" >&2
        printf '(Source MUST be a path relative to the location of target!)\n' >&2
        return 2
      fi
    
      git update-index --add --cacheinfo 120000 \
          "$(printf '%s' "$source_file_or_dir" | git hash-object -w --stdin)" \
          "${target_symlink}" \
        && git checkout -- "$target_symlink" \
        && printf '%s -> %s\n' "${target_symlink#$GIT_PREFIX}" "$source_file_or_dir" \
        || return $?
    }
    __git_add_symlink
    ETX
    )"
    

    Verwendung: git add-symlink <source_file_or_dir> <target_symlink>, Wobei das der Quelldatei oder dem Quellverzeichnis entsprechende Argument die Form eines Pfads haben muss relativ zum Zielsymlink. Sie können diesen Alias ​​genauso verwenden wie Sie würde normalerweise ln verwenden.

    Zum Beispiel der Repository-Baum:

    dir/
    dir/foo/
    dir/foo/bar/
    dir/foo/bar/baz      (file containing "I am baz")
    dir/foo/bar/lnk_file (symlink to ../../../file)
    file                 (file containing "I am file")
    lnk_bar              (symlink to dir/foo/bar/)
    

    Kann unter Windows wie folgt erstellt werden:

    git init
    mkdir -p dir/foo/bar/
    echo "I am baz" > dir/foo/bar/baz
    echo "I am file" > file
    git add -A
    git commit -m "Add files"
    git add-symlink ../../../file dir/foo/bar/lnk_file
    git add-symlink dir/foo/bar/ lnk_bar
    git commit -m "Add symlinks"
    
  2. Ersetzen von Git-Symlinks durch NTFS-Hardlinks + Junctions

    git config --global alias.rm-symlinks '!'"$(cat <<'ETX'
    __git_rm_symlinks() {
      case "$1" in (-h)
        printf 'usage: git rm-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      ppid=$$
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "[email protected]" ;;
      esac | while IFS= read -r symlink; do
        case "$symlink" in
          (*/*) symdir=${symlink%/*} ;;
          (*) symdir=. ;;
        esac
    
        git checkout -- "$symlink"
        src="${symdir}/$(cat "$symlink")"
    
        posix_to_dos_sed='s_^/\([A-Za-z]\)_\1:_;s_/_\\\\_g'
        doslnk=$(printf '%s\n' "$symlink" | sed "$posix_to_dos_sed")
        dossrc=$(printf '%s\n' "$src" | sed "$posix_to_dos_sed")
    
        if [ -f "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //H "$doslnk" "$dossrc"
        Elif [ -d "$src" ]; then
          rm -f "$symlink"
          cmd //C mklink //J "$doslnk" "$dossrc"
        else
          printf 'error: git-rm-symlink: Not a valid source\n' >&2
          printf '%s =/=> %s  (%s =/=> %s)...\n' \
              "$symlink" "$src" "$doslnk" "$dossrc" >&2
          false
        fi || printf 'ESC[%d]: %d\n' "$ppid" "$?"
    
        git update-index --assume-unchanged "$symlink"
      done | awk '
        BEGIN { status_code = 0 }
        /^ESC\['"$ppid"'\]: / { status_code = $2 ; next }
        { print }
        END { exit status_code }
      '
    }
    __git_rm_symlinks
    ETX
    )"
    
    git config --global alias.rm-symlink '!git rm-symlinks'  # for back-compat.
    

    Verwendung:

    git rm-symlinks [symlink] [symlink] [...]
    

    Dieser Alias ​​kann Git-Symlinks einzeln oder auf einen Schlag entfernen. Symlinks werden durch NTFS-Hardlinks (bei Dateien) oder NTFS-Junctions (bei Verzeichnissen) ersetzt. Die Verwendung von Hardlinks + Junctions gegenüber "echten" NTFS-Symlinks hat den Vorteil, dass keine erhöhten UAC-Berechtigungen erforderlich sind, damit sie erstellt werden können.

    Um Symlinks von Submodulen zu entfernen, verwenden Sie einfach die integrierte Unterstützung von git, um diese zu durchlaufen:

    git submodule foreach --recursive git rm-symlinks
    

    Aber für jede drastische Handlung wie diese ist es schön, eine Umkehrung zu haben ...

  3. Wiederherstellen von Git-Symlinks unter Windows

    git config --global alias.checkout-symlinks '!'"$(cat <<'ETX'
    __git_checkout_symlinks() {
      case "$1" in (-h)
        printf 'usage: git checkout-symlinks [symlink] [symlink] [...]\n'
        return 0
      esac
      case $# in
        (0) git ls-files -s | grep -E '^120000' | cut -f2 ;;
        (*) printf '%s\n' "[email protected]" ;;
      esac | while IFS= read -r symlink; do
        git update-index --no-assume-unchanged "$symlink"
        rmdir "$symlink" >/dev/null 2>&1
        git checkout -- "$symlink"
        printf 'Restored git symlink: %s -> %s\n' "$symlink" "$(cat "$symlink")"
      done
    }
    __git_checkout_symlinks
    ETX
    )"
    
    git config --global alias.co-symlinks '!git checkout-symlinks'
    

    Verwendung: git checkout-symlinks [symlink] [symlink] [...] Macht git rm-symlinks Rückgängig und stellt den natürlichen Zustand des Repositorys wieder her (mit Ausnahme Ihrer Änderungen, die sollte intakt bleiben).

    Und für Submodule:

    git submodule foreach --recursive git checkout-symlinks
    
  4. Einschränkungen:

    • Verzeichnisse/Dateien/Symlinks mit Leerzeichen in ihren Pfaden sollten funktionieren. Aber Tabs oder Newlines? YMMV… (Damit meine ich: Tu das nicht, weil es geht nicht funktioniert.)

    • Wenn Sie selbst oder andere das git checkout-symlinks Vergessen, bevor Sie etwas mit möglicherweise weitreichenden Konsequenzen wie git add -A Tun, könnte das lokale Repository in einen verschmutzten Zustand geraten.

      Verwenden Sie unser "Beispiel-Repo" von vor:

      echo "I am nuthafile" > dir/foo/bar/nuthafile
      echo "Updating file" >> file
      git add -A
      git status
      # On branch master
      # Changes to be committed:
      #   (use "git reset HEAD <file>..." to unstage)
      #
      #       new file:   dir/foo/bar/nuthafile
      #       modified:   file
      #       deleted:    lnk_bar           # POLLUTION
      #       new file:   lnk_bar/baz       # POLLUTION
      #       new file:   lnk_bar/lnk_file  # POLLUTION
      #       new file:   lnk_bar/nuthafile # POLLUTION
      #
      

      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 Pushen. 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!

Referenzen:

http://git-scm.com/book/en/Git-Internals-Git-Objects

http://technet.Microsoft.com/en-us/library/cc753194

Letzte Aktualisierung: 13.03.2019

  • POSIX-Konformität (nun, mit Ausnahme der mklink Aufrufe natürlich) - nicht mehr Bashisms !
  • Verzeichnisse und Dateien mit Leerzeichen werden unterstützt.
  • Null- und Nicht-Null-Beendigungsstatuscodes (für die Übermittlung von Erfolg/Misserfolg des angeforderten Befehls) werden jetzt ordnungsgemäß beibehalten/zurückgegeben.
  • Der Alias ​​add-symlink Funktioniert jetzt mehr wie ln (1) und kann von jedem Verzeichnis im Repository aus verwendet werden, nicht nur vom Stammverzeichnis des Repositorys.
  • Der Alias ​​rm-symlink (Singular) wurde durch den Alias ​​rm-symlinks (Plural) ersetzt, der jetzt mehrere Argumente (oder gar keine Argumente) akzeptiert und alle Symlinks im gesamten Repository findet Vorher) zum selektiven Umwandeln von Git-Symlinks in NTFS-Hardlinks + -Junctions.
  • Der Alias ​​checkout-symlinks Wurde ebenfalls aktualisiert, um mehrere Argumente (oder keines, == alles) für die selektive Umkehrung der oben genannten Transformationen zu akzeptieren.

Schlussbemerkung: Während ich das Laden und Ausführen dieser Aliase mit Bash 3.2 (und sogar 3.1) getestet habe, für diejenigen, die möglicherweise noch in solch alten Versionen für stecken Beachten Sie aus beliebig vielen Gründen, dass so alte Versionen für ihre Parser-Bugs berüchtigt sind. Wenn bei der Installation eines dieser Aliase Probleme auftreten, sollten Sie als Erstes ein Upgrade Ihrer Shell durchführen (für Bash überprüfen Sie die Version mit STRG + X, STRG + V). Wenn Sie alternativ versuchen, sie zu installieren, indem Sie sie in Ihren Terminalemulator einfügen, haben Sie möglicherweise mehr Glück, wenn Sie sie in eine Datei einfügen und stattdessen eine Quelle dafür auswählen, z. wie

. ./git-win-symlinks.sh

Viel Glück!

178
Mark G.

In der neuesten Version von git scm (testet 2.11.1) können symbolische Links aktiviert werden. Aber Sie müssen das Repository mit den Symlinks erneut 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 .

enter image description here

60
sirlunchalot

Es sollte in msysgit implementiert werden, aber es gibt zwei Nachteile:

  • Symbolische Links sind nur in Windows Vista und höher verfügbar (sollte 2011 kein Problem darstellen und ist es dennoch ...), da ältere Versionen nur Verzeichnisknoten unterstützen.
  • (die große) Microsoft betrachtet symbolische Links als Sicherheitsrisiko und kann sie daher standardmäßig nur von Administratoren erstellen. Sie müssen die Berechtigungen für den Git-Prozess erhöhen oder fstool verwenden, um dieses Verhalten auf jedem Computer zu ändern, auf dem Sie arbeiten.

Ich habe eine schnelle Suche durchgeführt und es wird aktiv daran gearbeitet, siehe Ausgabe 224 .

14
djs

da sich die Dinge mit GIT geändert haben, seit viele dieser Antworten hier gepostet wurden, finden Sie hier die richtigen Anweisungen, um zu gewährleisten, dass Symlinks in Windows ab korrekt funktionieren

AUGUST 2018


1. Stellen Sie sicher, dass Git mit Symlink-Unterstützung installiert ist

During the install of git on windows

2. Bash anweisen, Hardlinks anstelle von Symlinks zu erstellen

EDIT - (Git-Ordner) /etc/bash.bashrc

ZU UNTEN HINZUFÜGEN - MSYS=winsymlinks:nativestrict

3. Setze git config so, dass symlinks verwendet werden

git config core.symlinks true

oder

git clone -c core.symlinks=true <URL>

ANMERKUNG: Ich habe versucht, dies der globalen Git-Konfiguration hinzuzufügen, und im Moment funktioniert es nicht für mich, also empfehle ich, dies jedem Repo hinzuzufügen ...

4. Ziehe 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 über ein Repo verfügen oder Submodule verwenden, werden die Symlinks möglicherweise nicht korrekt erstellt, sodass alle Symlinks im Repo aktualisiert werden und Sie diese ausführen können befehle.

find -type l -delete
git reset --hard

HINWEIS: Dadurch werden alle Änderungen seit dem letzten Festschreiben zurückgesetzt. Stellen Sie also sicher, dass Sie zuerst festgeschrieben haben

10
Simon

Ich würde vorschlagen, dass Sie keine Symlinks innerhalb des Repos verwenden. Speichern Sie den eigentlichen Inhalt innerhalb des Repos und platzieren Sie Symlinks außerhalb des Repos, die auf den Inhalt verweisen.

Nehmen wir also an, Sie verwenden ein Repo ', um das Hosting Ihrer Site auf * nix mit dem Hosting auf win zu vergleichen. Speichern Sie den Inhalt in Ihrem Repo ', sagen wir /httpRepoContent und c:\httpRepoContent Hierbei handelt es sich um den Ordner, der über GIT, SVN usw. synchronisiert wird.

Ersetzen Sie dann den Inhaltsordner Ihres Webservers (/var/www und c:\program files\web server\www {Namen sind eigentlich egal, editieren wenn nötig}) mit einem symbolischen Link zum Inhalt Ihres Repos. Die Webserver sehen den Inhalt als an der richtigen Stelle, aber Sie können Ihre Quellcodeverwaltung verwenden.

Wenn Sie jedoch Symlinks mit im Repository 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 erledigen, wie zum Beispiel das Parsen von Codedateien über einen Formatierer, 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, ausführt, dann fügen Sie bitte einen Kommentar hinzu.

9
thecoshman

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/

In Windows 10 Creators Update kann ein Benutzer (mit Administratorrechten) zuerst den Entwicklermodus aktivieren. Anschließend kann jeder Benutzer auf dem Computer den Befehl mklink ausführen, ohne eine Befehlszeilenkonsole zu öffnen.

Was hat diese Veränderung bewirkt? Die Verfügbarkeit und Verwendung von Symlinks ist für moderne Entwickler von großer Bedeutung:

Viele beliebte Entwicklungstools wie git und Paketmanager wie npm erkennen und behalten Symlinks bei, wenn sie Repos bzw. Pakete erstellen. Wenn diese Repos oder Pakete dann an einer anderen Stelle wiederhergestellt werden, werden auch die Symlinks wiederhergestellt, um sicherzustellen, dass kein Speicherplatz (und keine Zeit für den Benutzer) verschwendet wird.

Bei allen anderen Ankündigungen des "Ersteller-Updates" leicht zu übersehen. Wenn Sie jedoch den Entwicklermodus aktivieren, können Sie Symlinks ohne erhöhte Berechtigungen erstellen. Möglicherweise müssen Sie neu installieren und sicherstellen, dass die Unterstützung aktiviert ist, da dies nicht standardmäßig der Fall ist.

Symbolic Links aren't enabled by default

9
Orangutech

Für Benutzer von CygWin unter Vista, Win7 oder höher kann der native Befehl git "richtige" Symlinks erstellen, die von Windows-Apps wie Android Studio erkannt werden =. Sie müssen nur die Umgebungsvariable CYGWIN so einstellen, dass sie winsymlinks:native oder winsymlinks:nativestrict so wie:

export CYGWIN="$CYGWIN winsymlinks:native"

Der Nachteil davon (und ein wesentlicher davon) 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 sind, sind jedoch keine besonderen Berechtigungen erforderlich, um sie zu verwenden . Solange sie nicht von einem anderen Entwickler im Repository geändert wurden, läuft git mit normalen Benutzerberechtigungen einwandfrei.

Persönlich verwende ich dies nur für Symlinks, die von Windows-Apps (d. H. Nicht-CygWin) aufgrund dieser zusätzlichen Schwierigkeit navigiert werden.

Weitere Informationen zu dieser Option finden Sie in dieser SO Frage: So stellen Sie eine symbolische Verbindung mit Cygwin in Windows 7 her

7
Brian White

Hier ist ein Batch-Skript zum Konvertieren von Symlinks im Repository, nur für Dateien, basierend auf Josh Lees Antwort. Das Skript mit einer zusätzlichen Überprüfung auf Administratorrechte finden Sie unter https://Gist.github.com/Quazistax/8daf09080bf54b4c7641 .

@echo off
pushd "%~dp0"
setlocal EnableDelayedExpansion

for /f "tokens=3,*" %%e in ('git ls-files -s ^| findstr /R /C:"^120000"') do (
     call :processFirstLine %%f
)
REM pause
goto :eof

:processFirstLine
@echo.
@echo FILE:    %1

dir "%~f1" | find "<SYMLINK>" >NUL && (
  @echo FILE already is a symlink
  goto :eof
)

for /f "usebackq tokens=*" %%l in ("%~f1") do (
  @echo LINK TO: %%l

  del "%~f1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: del
    goto :eof
  )

  setlocal
  call :expandRelative linkto "%1" "%%l"
  mklink "%~f1" "!linkto!"
  endlocal
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: mklink
    @echo reverting deletion...
    git checkout -- "%~f1"
    goto :eof
  )

  git update-index --assume-unchanged "%1"
  if not !ERRORLEVEL! == 0 (
    @echo FAILED: git update-index --assume-unchanged
    goto :eof
  )
  @echo SUCCESS
  goto :eof
)
goto :eof

:: param1 = result variable
:: param2 = reference path from which relative will be resolved
:: param3 = relative path
:expandRelative
  pushd .
  cd "%~dp2"
  set %1=%~f3
  popd
goto :eof
5
Quazistax

Ich suchte nach einer einfachen Lösung, um mit den symbolischen Unix-Links auf Windows umzugehen. Vielen Dank für die obigen 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 nicht mit einem Verzeichnis verknüpft ist, bevor die Logik ausgeführt wird.

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
for symlink in $(git ls-files -s | egrep "^120000" | cut -f2); do
    *if [ -d "$symlink" ]; then
      continue
    fi*
    git rm-symlink "$symlink"
    git update-index --assume-unchanged "$symlink"
done
}; __git_rm_symlinksenter 
2
prgrminglover

Ich verwende die ganze Zeit 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. An der Kreuzung scheint sich git normal zu verhalten:

>mklink /j <location(path) of link> <source of link>

beispielsweise:

>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\Apache2\htdocs\Posts

2
mmv_sat

Ein einfacher Trick, den wir verwenden, besteht darin, zweimal hintereinander git add --all Aufzurufen.

Beispiel: Unsere Windows 7-Festschreibungsskriptaufrufe:

$ git add --all
$ git add --all

Das erste Hinzufügen behandelt den Link als Text und fügt die zu löschenden Ordner hinzu.

Das zweite Hinzufügen überquert den Link korrekt und macht das Löschen rückgängig, indem die Dateien wiederhergestellt werden.

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.

1
Mike Panoff