2011-01-05 18 views
44

Mam skrypt, w którym dodaję wszystkie nowe pliki przed popełnić moją kopię roboczą do mojego repozytorium z tej linii:Jak usunąć wszystkie usunięte pliki z repozytorium?

svn status | grep ^\? | awk '{print $2}' | xargs svn add 

Chcę teraz dodać wiersz Usuń z repozytorium wszystkie usunięte pliki w mojej pracy Kopiuj. Innymi słowy, nie mogę ich określić jeden po drugim i muszę je wykryć przy użyciu statusu svn, a następnie automatycznie je usunąć. Jednak linia nie działa.

svn status | grep ^\! | awk '{print $2}' | xargs svn --force delete 

Jak widać mam wymienić

"?" z "!" i

"add" z "--force delete"

Czy możesz mi powiedzieć, dlaczego to robi” t działa?

ps. Wiem, że to ryzykowna procedura. Omówiłem już wszystko na ten temat. dzięki

dzięki

+0

Czy próbowałeś? Dlaczego nie zrobić tego samemu, zamiast czekać na odpowiedź? – viraptor

+0

@viraptor Właśnie próbowałem, to nie działa – aneuryzm

+0

Problem polega na tym, że próbujesz usunąć pliki, które są oznaczone wykrzyknikiem, co oznacza, że ​​coś jest nie tak. Oznacza to, że usunąłeś ten plik, wykonując komendę systemu operacyjnego zamiast polecenia svn delete, którego SVN nie lubi ...... Problem, którego nie rozumiem ... w jaki sposób usunąłeś pliki, które teraz chcesz zrobić permanent przez svn rm - force? – khmarbaise

Odpowiedz

59

Właśnie próbowałem i działa idealnie.

$ svn st | grep '^!' | awk '{print $2}' | xargs svn delete --force 
D   groups.pl 
D   textblock.pl 

Czy Twoje pliki zawierają spacje?

CZEKAJ SEKUNDĘ !! Widzę problem. Masz:

svn --force delete 

a nie:

svn delete --force 

--force jest parametrem komendy delete a nie komenda svn.

+0

Mam pytanie na ten temat. Czy jeśli usunę plik, stracę wszystkie poprzednie wersje? Innymi słowy, nie mogę tego więcej zmienić, prawda? Czy wszystkie wcześniejsze zobowiązania również zostały usunięte? – aneuryzm

+0

To nadal nie działa ... ale myślę, że w tym momencie używam narzędzia takiego jak rsync do tworzenia kopii zapasowych moich plików (ten komentarz nie wchodzi w grę, ale zdałem sobie sprawę, że nie mogę używać takiego svn) – aneuryzm

+1

Tak, możesz pobrać plik, który został usunięty. Musisz znaleźć rewizję katalogu z usuniętym plikiem i użyć przypinania do wersji ("@" na końcu adresu URL). Tam możesz skopiować brakujący plik do aktualnej wersji. Możesz także wykonać odwrotne scalanie, aby cofnąć wszystkie zmiany. W rzeczywistości jedna z reklamacji dotyczących svn polega na tym, że nie można całkowicie usunąć (zniszczyć) pliku w przypadku, gdy popełniłeś plik, do którego nie masz przypuszczenia (np. Twoje hasło). –

2

co o dodawaniu można po prostu użyć

svn add --force . 

lub

svn --force add . 

byłoby zrobić to samo: dodaj wszystkie pliki niewersjonowane wyjątkiem ones dopasowania svn: ignore wzory

+0

Skrypt OP działa rekurencyjnie - ta metoda nie działa. – Mortoc

+3

dlaczego? Sprawdziłem to, działa rekurencyjnie – sdespolit

2

podejście używając oneliner perl byłoby:

svn st | perl -ne 'print "$1\n" if /^\!\s+(.*)/' | xargs svn rm 

to powinno również pracować z spacji w nazwach plików.

edit: ulepszone regexp

5
svn status | grep '^!' | sed 's/! *//' | xargs -d '\n' svn delete --force 

Rozwiązanie działa w nazwach plików ze spacjami i znakami specjalnymi.

  • svn status - wykaz wszystkich zmian, usunięte pliki są oznaczone jako !
  • grep '^!' - wydobywa linii, który zaczyna się ! (tj usunięte pliki)
  • sed 's/! *//' - usuwa ! -char na początku i po nim spacji
  • - traktuje każdy wiersz wprowadzania (łącznie ze spacjami i znakami specjalnymi) jako oddzielny argument i przekazuje je do svn delete --force
+0

FYI Opcja '-d' z' xargs' nie jest obsługiwana w systemie OS X - wydaje się, że działa tylko na Linuksie (czy coś mi brakuje?) – HughHughTeotl

+0

Wznawiana dla '-d '\ n'' opcja! – Mitchapp

Powiązane problemy