2013-11-09 11 views
6

Jestem w folderze głównym git, którego ścieżka bezwzględna to /path/project/. Struktura folderów jest:Git rm działa na ścieżce względnej do dowiązania symbolicznego, ale nie ścieżce bezwzględnej

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

mogę usunąć dowiązania symbolicznego z git rm za pomocą ścieżki względnej: git rm exec/alib_link

Ale za pomocą ścieżki bezwzględnej powoduje git aby spróbować usunąć mój oryginalny folder, zamiast

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

Jak czy mogę zmusić gita do usunięcia dowiązania symbolicznego za pomocą bezwzględnej ścieżki, bez powodowania, że ​​spróbuje usunąć mój oryginalny katalog?

Odpowiedz

3

Najlepszą udało mi się wymyślić na to alias Git przy użyciu Perl:

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

Można wtedy zrobić

git rma /path/project/alib_link 

z dowolnego miejsca w repozytorium, z pożądany efekt.


Jak to działa:

  • GIT alias rma wywołuje funkcję powłoki f.
  • Ten strumień $1 (argument do git rma) do Perla przy użyciu echo. Perl czyta to przy użyciu <>.
  • Zmienna Perl $a jest używana w odniesieniu do pliku, który próbujesz usunąć, używając bezwzględnej ścieżki.
  • Zmienna Perl $r jest używana w odniesieniu do pliku, który próbujesz usunąć, używając ścieżki do katalogu roboczego. Zauważ, że aliasy Git, które uruchamiają komendy powłoki, używają repozytorium jako katalogu roboczego.
  • Względna ścieżka jest "zwracana" z Perla przez jej wydrukowanie. Następnie jest przechowywany w zmiennej powłoki $r.
  • Na koniec uruchamiamy git rm $r, aby usunąć plik. Zauważ, że działa to również w katalogu roboczym (to znaczy katalogu głównym repozytorium).

bardziej zwięzła wersja może być:

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

+10 za wskazanie, że aliasy git korzystać z repozytorium korzeń jako katalogu roboczego. Poczekam trochę, aby sprawdzić, czy pojawią się lepsze opcje, ale dziękuję za pomoc. –

+0

@ LimH .: Brak problemów. Warto zauważyć, że tylko aliasy git, które robią powłoki, używają repozytorium jako katalogu roboczego. Jeśli utworzysz alias taki jak 'rmr = rm -r', wówczas użyje on bieżącego katalogu. Jako dalszą obserwację - odkryłem w trakcie zabawy, że względna ścieżka od katalogu głównego repozytorium do oryginalnego katalogu roboczego zostanie zapisana w zmiennej środowiskowej GIT_PREFIX, jeśli będzie potrzebna. –

Powiązane problemy