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?


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 @ .


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 'image@2x.png@'

lub

svn info "image@2x.png@"

lub

svn info image\@2x.png\@

Właśnie przetestowałem wszystkie trzy.


4
Testowałem też svn info icon@2x.png@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ć.


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: obraz@2x.png wykonaj następujące czynności: svn dodaj obraz \ @ 2x.png @


11

Po prostu dodaj

@

w pliku, którego potrzebujesz użyć, bez względu na to, jakie jest polecenie SVN, np .:

file@2x.jpg

do

file@2x.jpg@

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/locales-usa@2x.png'

Ale to zrobiło:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'

6

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

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add

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”


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 splash@2x.png@

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


0

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

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


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@ ")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.