2013-11-09 9 views
6

Ich bin auf dem Git Root-Ordner, deren absoluter Pfad ist /path/project/. Die Ordnerstruktur ist:Git rm arbeitet auf relativen Pfad zu symbolischen Link, aber nicht absoluten Pfad

/path/project 
---- libs/alib (actual library folder) 
---- exec/alib_link (symbolic link to the actual alib folder) 

ich die symbolische Verbindung mit git rm mit relativem Pfad entfernen: git rm exec/alib_link

Aber mit absolutem Pfad verursacht git zu versuchen, meinen ursprünglichen Ordner zu löschen, anstatt

git rm /path/project/alib_link 
fatal: not removing /path/project/libs/alib recursively without -r 

Wie kann ich git zwingen, den symbolischen Link mit dem absoluten Pfad zu entfernen, ohne dass er versucht, mein ursprüngliches Verzeichnis zu löschen?

Antwort

3

Das Beste, was ich in der Lage bin, mit zu kommen hierfür ist ein Git alias Perl:

rma = "!f() { r=`echo $1 | perl -e 'use Path::Class; $a=file(<>); $r=$a->relative(\".\"); print $r;'`; git rm $r; }; f" 

Sie können tun, dann

git rma /path/project/alib_link 

von überall in Ihrem Repository, mit dem gewünschter Effekt.


Wie es funktioniert:

  • Der Git alias rma die Shell-Funktion f aufruft.
  • Dies streamt $1 (das Argument zu git rma) zu Perl mit echo. Perl liest es mit <> ein.
  • Die Perl-Variable $a bezieht sich auf die Datei, die Sie mit ihrem absoluten Pfad entfernen möchten.
  • Die Perl-Variable $r wird verwendet, um auf die Datei Bezug zu nehmen, die Sie mit ihrem Pfad relativ zum Arbeitsverzeichnis entfernen möchten. Beachten Sie, dass Git-Aliase, die Shell-Befehle ausführen, den Repository-Stamm als ihr Arbeitsverzeichnis verwenden.
  • Der relative Pfad wird von Perl "zurückgegeben", indem er gedruckt wird. Es wird dann in der Shell-Variablen $r gespeichert.
  • Schließlich führen wir git rm $r, um die Datei tatsächlich zu entfernen. Beachten Sie, dass dies auch im Arbeitsverzeichnis (d. H. Dem Repository-Root) ausgeführt wird.

Eine kurze Version könnte sein:

rma = "!f() { git rm `perl -e 'use Path::Class; print file($ARGV[0])->relative(\".\");' $1`; }; f" 
+0

+10 für den Hinweis auf, dass git Aliase als Arbeitsverzeichnis des Repository root verwenden. Ich warte ein bisschen, um zu sehen, ob irgendwelche besseren Optionen kommen, aber danke für Ihre Hilfe. –

+0

@LimH .: Keine Probs. Es ist erwähnenswert, dass nur git-Aliase, die Shell-Sachen verwenden, den Repository-Stamm als ihr Arbeitsverzeichnis verwenden. Wenn Sie einen Alias ​​wie zum Beispiel 'rmr = rm -r 'erstellen, wird das aktuelle Verzeichnis verwendet. Als weitere Beobachtung - habe ich dabei festgestellt, dass der relative Pfad vom Repository-Stamm zum ursprünglichen Arbeitsverzeichnis in der Umgebungsvariablen GIT_PREFIX gespeichert wird, falls es benötigt wird. –

Verwandte Themen