Як уникнути символів @ у назвах файлів, якими керується Subversion?


191

Для багатьох операцій Subversion додавання символу "@" до кінця файлу або аргументу URL дозволяє націлити конкретний перегляд цього файлу. Наприклад, "svn info test.txt@1234" надасть інформацію про test.txt як вона існувала в редакції 1234.

Однак, коли ім'я файлу містить знак @, Subversion неправильно інтерпретується як специфікатор редакції:

svn info 'test @ .txt' svn: редакція синтаксичного аналізу помилок '.txt'

Я спробував подвійні та одинарні лапки, а також втечу з '/', '\' та '@'. Як я можу сказати Subversion розглядати символи @ як частину імені файлу?


3
Чому на землі у вас є назви файлів із символом @ у них?
Просиш

Дуже гарне запитання! :) Я беру проект, де цей символ є основним компонентом конвенцій про іменування файлів, і, на жаль, це не може бути змінено найближчим часом.
weston

57
Apple створила цю конвенцію для всіх своїх розробників iOS станом на iOS 4+. Усі активи повинні бути названі @ 2x, якщо вони відображаються з високою роздільною здатністю ...
Димитріс,

2
Стандарт для гетто старого стилю Matlab OO
Chinasaur

Крім того, якщо ви збережете свій приватний ключ або ключ відкликання з Enigmail Thunderbird, він створює ім’я файлу - не безпідставно, з огляду на додаток - містить знак на знак
Пітер Флін

Відповіді:


283

З книги SVN (наголос додано):

Перцептивний читач, напевно, в цей момент задається питанням, чи не викликає синтаксис редагування прив’язки певних файлів проблеми в робочих контурах чи URL-адресах, які насправді мають знаки в них. Зрештою, як svn знає, чи news@11є ім'я каталогу в моєму дереві чи просто синтаксис для "редакції 11 новин "? На щастя, хоча svn завжди буде вважати останнє, існує тривіальне рішення. Вам потрібно всього лише додати в знак кінця шляху , такі як news@11@. svn піклується лише про останнє в аргументі знака, і не вважається незаконним опускати специфікатор довільної ревізії прив’язки після цього під знаком. Це вирішення стосується навіть шляхів, які закінчуються в знаку - ви б використалиfilename@@говорити про файл з ім'ям файлу @ .


4
Зауважте, що для використання "svn diff" вам потрібно додати параметр перегляду. "svn up @ file @" працює, але "svn diff @ файл @" не працює. Вам потрібно скористатися "svn diff -r HEAD @ file @"
analytik

Примітка для книги SVN: файли можуть існувати без розширень навіть у Windows, тому news@11може бути і файл.
trysis

1
Зауважте, що для деяких команд, таких як перейменування, аргументом може бути або перетворений елемент, або ім'я локального файлу. У разі перейменування ціль також сканується на впорядковану версію, але згодом вона може розглядатися як звичайна назва. Наприклад, якщо ви хочете перейменувати , @fooщоб @bar, svn rename @foo@ @barбуде скаржитися @bar; але якщо ви це зробите svn rename @foo@ @bar@, нове ім’я буде буквально @bar@. Щоб уникнути цього, додайте ./(або .\ на вікнах) , щоб зробити це ясно , що це локальний шлях: svn rename @foo@ ./@bar.
Застаї

82

Оригінальна відповідь правильна, але, можливо, недостатньо явна. Конкретні параметри командного рядка unix такі:

svn info 'image@2x.png@'

або

svn info "image@2x.png@"

або

svn info image\@2x.png\@

Я тільки перевірив усіх трьох.


4
Я теж тестував, svn info icon@2x.png@і це теж працювало. Так, жодних котирувань чи косої риси!
Нейт

Необхідність цитування залежить від вашої оболонки - я використовую KSH і точно вам потрібні лапки (оскільки "@" - знак, що ви хочете, щоб процес запускався у фоновому режимі). YMMV залежно від оболонки.
Девід Н

Так. Мій пробіг був на bashшосе :)
Нейт

1
@Nate Тепер я не можу зробити це невдалим - його працює нормально без цитат в ksh. Я не знаю, чому я думав, що вони мені потрібні - можливо, якесь інше питання - це було 2 роки тому, коли я опублікував це ...
Девід Н

14

Рішення для додавання декількох файлів у різні підпапки:

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

Просто замініть "png" на " @ .png" на тип файлів, які ви хочете додати.


обов'язково цитуйте і уникайте своїх імен файлів (і не збігайте регістр). Крім того, немає ніякої необхідності , щоб лікувати файли з @їх ім'ям , як окремий випадок, ви можете сміливо додавати в @символ на всі імена файлів: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. також, чи не залишає цей підхід ваш svn repo зі структурою файлів / каталогів, що не відповідає робочій локальній копії?
ardnew

Використання execзнахідки може бути легше:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung,



8

У моєму випадку мені потрібно було видалити файли з репортажу SVN, який містив знак @:

Це не працює:

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

Але це зробило:

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

6

Щоб додати кілька файлів, існує альтернативне рішення:

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

Будь ласка, поясніть свою відповідь.
Хеман

3
Ви можете використовувати awk замість grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi

1

Для команд svn з двома аргументами, такими як "переміщення", ви повинні додати "@" лише в лівому (першому) параметрі. Наприклад:

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

Цей рядок важливий: $ svn move README @ txt @ README2 @ txt

Як бачите, нам не потрібно додавати "@" у "README2 @ txt"


0

@David H

Я просто спробував подібну команду, не уникаючи символів @, і вона все ще працює добре

svn ci splash.png splash@2x.png@

Це на GNU bash, версія 3.2.48 (1) -release (x86_64-apple-darwin10.0) та svn 1.6.16


0

Єдине рішення, яке працювало для мене, те саме, що запропонував @NPike

svn повернути 'шлях / до / ім'я файлу @ ext @'


Ви впевнені, що це має бути нова відповідь на початкове запитання? Це, скоріше, може бути результатом або коментарем
Ніко Хааз

Вибачте, мій поганий, я поки не можу додати коментар
Jonyx4,

0

У мене сьогодні були проблеми з іменами, згенерованими з електронних адрес (не дуже гарна ідея!).

Рішення, використовуючи printfпараметри findта розширення оболонки

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.