Jak zmieniać znaki @ w nazwach plików zarządzanych przez Subversion?

191

W przypadku wielu operacji Subversion dodanie symbolu „@” na końcu argumentu pliku lub adresu URL pozwala na wybranie określonej wersji tego pliku. Na przykład „svn info test.txt@1234” poda informacje o test.txt, tak jak istniało w wersji 1234.

Jednak gdy nazwa pliku zawiera @, jest niepoprawnie interpretowana przez Subversion jako specyfikator wersji:

svn info 'test @ .txt' svn: Błąd składni podczas analizy wersji '.txt'

Próbowałem podwójnych i pojedynczych cudzysłowów, a także znaków ucieczki za pomocą „/”, „\” i „@”. Jak mogę powiedzieć Subversion, aby traktował symbole @ jako część nazwy pliku?

weston
źródło
3
Dlaczego, u licha, masz nazwy plików z @ w nich? Pytanie o kłopoty, jeśli mnie zapytasz ... :-)
JesperE
Bardzo dobre pytanie! :) Przejmuję projekt, w którym ta postać jest podstawowym składnikiem konwencji nazewnictwa plików i niestety nie można tego zmienić w najbliższej przyszłości.
weston
57
Apple stworzyło tę konwencję dla wszystkich programistów iOS od wersji iOS 4+. Wszystkie zasoby powinny mieć nazwę @ 2x, jeśli są przeznaczone do wyświetlania w wysokiej rozdzielczości ...
Dimitris
2
Standard dla getta w starym stylu Matlab OO
Chinasaur
Ponadto, jeśli zapiszesz swój klucz prywatny lub klucz odwołania z Enigmail Thunderbirda, tworzy on nazwę pliku - nie bez racji, biorąc pod uwagę aplikację - zawierającą znak at
Peter Flynn

Odpowiedzi:

283

Z książki SVN (wyróżnienie dodane):

Spostrzegawczy czytelnik prawdopodobnie zastanawia się w tym momencie, czy składnia korekty kołka powoduje problemy z działającymi ścieżkami kopii lub adresami URL, które faktycznie mają w nich znaki. W końcu skąd svn wie, czy news@11jest to nazwa katalogu w moim drzewie, czy tylko składnia „rewizji 11 wiadomości ”? Na szczęście, chociaż svn zawsze zakłada to drugie, istnieje trywialne obejście. Wystarczy dołączyć znak „at” na końcu ścieżki , np news@11@. svn dba tylko o ostatni znak w argumencie i nie jest uważane za nielegalne pominięcie dosłownego specyfikatora rewizji kołka po tym znaku. To obejście dotyczy nawet ścieżek, które kończą się znakiem at - użyłbyś tegofilename@@mówić o pliku o nazwie nazwa_pliku @ .

Rob Kennedy
źródło
4
Zauważ, że do korzystania z „svn diff” musisz dodać parametr rewizji. „svn up @ file @” działa, ale „svn diff @ file @” nie działa. Musisz użyć „svn diff -r HEAD @ file @”
analytik 18.10.11
Uwaga do książki SVN: pliki mogą istnieć bez rozszerzeń, nawet w systemie Windows, więc news@11może być również plikiem.
trysis
1
Zauważ, że w przypadku niektórych poleceń, takich jak zmiana nazwy, argumentem może być element w wersji lub nazwa pliku lokalnego. W przypadku zmiany nazwy cel skanowany jest również pod kątem przypiętej wersji, ale później może być traktowany jako zwykła nazwa. Na przykład, jeśli chcesz zmienić nazwę @foona @bar, svn rename @foo@ @barbędą narzekać @bar; ale jeśli to zrobisz svn rename @foo@ @bar@, nowa nazwa będzie dosłownie @bar@. Aby tego uniknąć, należy dodać ./(lub .\ w systemie Windows), aby było jasne, że jest to ścieżka lokalna: svn rename @foo@ ./@bar.
Zastai
82

Oryginalna odpowiedź jest poprawna, ale być może nie jest wystarczająco wyraźna. Poszczególne opcje wiersza poleceń unix są następujące:

svn info '[email protected]@'

lub

svn info "[email protected]@"

lub

svn info image\@2x.png\@

Właśnie przetestowałem wszystkie trzy.

David H.
źródło
4
Testowałem też svn info [email protected]@i to też zadziałało. Tak, bez cudzysłowów i ukośników!
Nate
Konieczność cytowania zależy od twojej powłoki - używam KSH i na pewno potrzebujesz cytatów (ponieważ „@” jest znakiem, że chcesz, aby proces działał w tle). YMMV w zależności od powłoki.
David H
Tak. Mój przebieg odbył się na bashautostradzie :)
Nate
1
@Nate Teraz nie mogę sprawić, że się nie powiedzie - działa dobrze bez cudzysłowów w ksh. Nie wiem, dlaczego myślałem, że ich potrzebuję - może jakiś inny problem - to było 2 lata temu, opublikowałem to ...
David H
14

Rozwiązanie do dodawania wielu plików w różnych podfolderach:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

Po prostu zamień „png” w „ @ .png” na pliki, które chcesz dodać.

Lcsky
źródło
pamiętaj o zacytowaniu lub zmianie nazw plików (i dopasuj bez rozróżniania wielkości liter). również nie ma potrzeby do plików leczyć @w ich imieniu jako szczególny przypadek, można bezpiecznie dołączyć @symbol na wszystkich nazw plików: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. również, czy to podejście nie pozostawia repozytorium svn ze strukturą plików / katalogów niespójną z działającą lokalną kopią?
nowy
użycie execfind może być łatwiejsze:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung
11

aby dodać następujący plik: [email protected] wykonaj następujące czynności: svn dodaj obraz \ @ 2x.png @

Malek Belkahla
źródło
8

W moim przypadku musiałem usunąć pliki z repozytorium SVN, które zawierały znak @:

To nie zadziałałoby:

svn remove 'src/assets/images/hi_res/[email protected]'

Ale to zrobiło:

svn remove 'src/assets/images/hi_res/[email protected]@'
NPike
źródło
6

Aby dodać wiele plików, istnieje alternatywne rozwiązanie:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
źródło
Proszę wyjaśnić swoją odpowiedź.
Hemang,
3
Możesz użyć awk zamiast grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi
1

W przypadku poleceń svn z 2 argumentami, takimi jak „move”, należy dołączyć „@” tylko przy lewym (pierwszym) parametrze. Na przykład:

$ svn add README@txt@
A         README@txt

$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt


$ svn status
A       README2@txt

$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.

$ svn delete README2@txt@
D         README2@txt

$ svn commit -m "blahblah"
*Deleting       README2@txt

Committed revision 169.

Ta linia jest ważna: $ svn move README @ txt @ README2 @ txt

Jak widać, nie musimy dołączać „@” do „README2 @ txt”

Srdjan
źródło
0

@David H.

Właśnie próbowałem podobnego polecenia bez uciekania się od symboli @ i nadal działa dobrze

svn ci splash.png [email protected]@

To jest na GNU bash, wersja 3.2.48 (1) -release (x86_64-apple-darwin10.0) i svn 1.6.16

Qazzian
źródło
0

Jedynym rozwiązaniem, które działało dla mnie, było to samo sugerowane przez @NPike

svn revert 'path / to / filename @ ext @'

Jonyx4
źródło
Czy na pewno powinna to być nowa odpowiedź na pierwotne pytanie? Powinno to być raczej głosowanie lub komentarz
Nico Haase
przepraszam, mój zła, nie mogę jeszcze dodać komentarza
Jonyx4
0

Miałem dzisiaj problem z nazwami plików generowanymi z adresów e-mail (niezbyt dobry pomysł!).

Rozwiązanie, używając printfopcji findi rozszerzenia powłoki

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
Michel Billaud
źródło