Як я можу "додати SVN" всі неперевершені файли до SVN?


177

Я шукаю хороший спосіб автоматичного додавання svn всіх неперевершених файлів у робочу копію до мого сховища SVN.

У мене є живий сервер, який може створити кілька файлів, які повинні знаходитися під контролем джерела. Я хотів би мати короткий сценарій, який я можу запустити, щоб автоматично додати їх, замість того, щоб переглядати та додавати їх по одному.

Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме.


1
@Saul Це питання явно передує тому, з яким ви пов’язали, так що я не бачу, як це може бути дублікатом. Якщо щось інше, це дублікат.
Нейтрино

Cygwin - це варіант. Дає вам силу удару в будь-якому середовищі Windows. Був користувачем понад 10 років із дуже незначними проблемами.
користувач151841

Відповіді:


346

svn add --force * --auto-props --parents --depth infinity -q

Чудова порада! Одне зауваження: мій Eclipse автоматично додає нові файли до списку ігнорування. Це може бути питання конфігурації, але все одно: є --no-ignoreваріант, який допомагає.

Після цього ви можете здійснити:

svn commit -m 'Adding a file'

14
Чудова порада. Набагато краще, ніж використання статусу svn. "svn add --force" видається достатнім.
Ім'я

1
Чи є простий спосіб встановити це на скорочений макрос (тобто, як ви можете з git)? Також, чи можна було б оновити цю відповідь, щоб вона пояснювала кожен біт?
MrDuk

2
@MrDuk: Скорочене: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Пояснено:svn help add
Ronan

17
Проблема, це правильне додавання ігнорованих файлів? Не бажано.
ladieu

1
@Name - вам потрібно покласти *кінець, інакше це не вийде (в оренді для мене)
vsync

72

Це моє інше питання, але є відповідь на це питання:

svn status | grep '?' | sed 's/^.* /svn add /' | bash

8
Для цього використовуються інструменти UNIX (grep, sed, bash), яких ОП заявила, що не має.
Naaff

3
також, напевно, ви могли б викопати sed і grep на windows, якщо дуже хотіли.
Сем Шафран

1
Вибачте за те, що пропозиція щодо коментаря cygwin не була навмисною (і я не можу її скасувати). Насправді я вважаю, що cygwin такий некрасивий, як ви можете потрапити в Windows. Ви все ще можете використовувати Findstr замість grep, який буде працювати принаймні з Windows 2000, не встановлюючи нічого додаткового.
Джої

@Johannes тільки для вас meta.stackexchange.com/questions/1775/…
Сем

2
Я з mbyrne215; ця відповідь допомогла мені більше, ніж рішення ОП, тому я голосую за це. Відмінно працює в OS X 10.6.7.
Asbjørn Ulsberg

37

Що працює:

c:\work\repo1>svn add . --force

Додає вміст підкаталогів.

Не додає ігноровані файли.

Перелічить, які файли додано.

Точка в команді вказує поточний каталог, його можна замінити певним іменем каталогу або шляхом, якщо ви хочете додати інший каталог, ніж поточний.


Насправді це має бути .\*або, якщо корінь svn знаходиться на іншому dir stuff\svn_root\*.
Nux

Я не стежу за цим. Команди SVN виконуються в контексті шляху, з якого вони виконуються, цього варто очікувати. "svn add. \ *" сам по собі не повторюється і друкує набір попереджувального спаму, що робить неможливим побачити, що було фактично додано. "svn add. \ * --force" повторюється, але також друкує "svn: аргумент пропуску: E200025: '. \. svn' закінчується зарезервованим іменем". Тож це здається гіршим, ніж моє оригінальне рішення.
Нейтрино

Я вказував, що у вас, мабуть, не є весь диск C на SVN ;-), і тому вам слід додати шлях. І з мого шляху тестування, оскільки stuff\svn_rootне додає файли в підкаталогах (наприклад, в stuff\svn_root\already_in_svn\not_in_svn.txt). Звідси зірка в кінці.
Nux

@Nux Тільки зараз після всіх цих років я нарешті бачу, що ви отримували :) У команді крапка - це шлях, який визначає поточний каталог. Звичайно, замість цього може бути надана будь-яка дійсна альтернатива.
Нейтрино

Це правильна відповідь. Я не впевнений, як рішення, яке включає додавання ігнорованих файлів, займає перше місце. @Neutrino, пропонуйте видалити свій коментар до joey, який більше не відображається на цій сторінці, а також додайте рядок, що підкріплює, що ваша пропозиція НЕ додає ігноровані файли
b_levitt

35

Це працювало для мене:

svn add `svn status . | grep "^?" | awk '{print $2}'`

( Джерело )

Оскільки ви вже вирішили свою проблему для Windows, це рішення UNIX (слідкуючи за Sam). Я додав сюди, оскільки вважаю, що все ще корисно для тих, хто звертається до цього питання, запитуючи те саме (оскільки назва не включає ключове слово "WINDOWS").

Примітка (лютий 2015 р.): Як коментує "bdrx", вищезазначена команда може бути додатково спрощена таким чином:

 svn add `svn status . | awk '/^[?]/{print $2}'`

1
Гарний, компактний, лаконічний, також досить добре піддається розширенню. Дякую.
Норман Н

1
Чудово. Також легко розгорнути, змінити, щоб видалити і т. Д.
Древід

Ідеально підходить для того, що мені було потрібно. Дякую!
Джефф

2
Чому люди завжди грепають, а потім намагаються прокинутися? Awk може робити зіставлення з зразком: awk '/^[?]/{print $2}'; Немає необхідності в додатковому процесі грепування.
bdrx

1
@bdrx: Можливо, тому, що греп зазвичай асоціюється з узгодженням шаблону? В моєму особистому випадку я набагато більше досвідчений з грепом, ніж з awk. Я не усвідомлював, що ти можеш робити такі речі дивним чином, тому я почну більше використовувати awk у своїх сценаріях. Дякую!
лепе

5
svn add --force .

Це додасть будь-який неперевершений файл у поточному каталозі та у всі дочірні каталоги.


5

Цей метод повинен обробляти імена файлів, у яких є будь-яке число / комбінація пробілів ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

Ось пояснення того, що робить ця команда:

  • Список усіх змінених файлів.
  • Обмежте цей список рядками "?" на початку - тобто нові файли.
  • Видалити "?" символ на початку рядка.
  • Видаліть пробіли на початку рядка.
  • Складіть назви файлів у xargs, щоб запустити SVN-додавання кілька разів.

Використовуйте аргумент -i для xargs, щоб обробити можливість імпортувати імена файлів з пробілами в 'svn add' - в основному, -i набори {} використовуються як заповнювач, щоб ми могли поставити символи "навколо імені файлу, використовуваного 'svn додати '.

Перевагою цього методу є те, що він повинен обробляти імена файлів з пробілами в них.


Це передбачає Linux або подібне (наприклад, MinGW або Cygwin ). ОП заявила: "Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме".
Пітер Мортенсен

4

TortoiseSVN має вбудовану можливість, якщо ви бажаєте використовувати рішення, що не використовується в командному рядку. Клацніть правою кнопкою миші папку верхнього рівня та виберіть Додати ...


З величезним сховищем висить TortoiseSVN. Це змусило мене шукати альтернативи командного рядка :-)
Upendra


3

Використання:

svn st | grep ? | cut -d? -f2 | xargs svn add

1
Або ви можете використовувати cut, щоб виконати роботу grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

Це передбачає Linux або подібне (наприклад, MinGW або Cygwin ). ОП заявила: "Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме".
Пітер Мортенсен

3

Я завжди використовую:

Копіювати Вставити

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explicity говорить, що рішення Unix йому не приносить користі.
Нейтрино

Це передбачає Linux або подібне (наприклад, MinGW або Cygwin ). ОП заявила: "Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме".
Пітер Мортенсен

3

Оскільки ця публікація позначена Windows, я подумав, що розробить рішення для Windows. Я хотів автоматизувати процес, і я створив bat-файл. Я чинив опір створення консолі.exe в C #.

Я хотів додати будь-які файли чи папки, які не додаються до мого сховища, коли я починаю процес фіксації.

Проблема багатьох відповідей полягає в тому, що вони перелічать неперевірені файли, які слід ігнорувати відповідно до мого списку ігнорування в TortoiseSVN .

Ось моя настройка гака та пакетний файл, який це робить

Сценарій гачка черепахи:

"start_commit_hook".
(where I checkout) working copy path = C:\Projects
command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat
(X) Wait for the script to finish
(X) (Optional) Hide script while running
(X) Always execute the script

svnadd.bat

@echo off

rem Iterates each line result from the command which lists files/folders
rem     not added to source control while respecting the ignore list.
FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G"
goto end

:DoSVNAdd
set addPath=%1
rem Remove line prefix formatting from svn status command output as well as
rem    quotes from the G call (as required for long folder names). Then
rem    place quotes back around the path for the SVN add call.
set addPath="%addPath:~9,-1%"
svn add %addPath%

:end

2
for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j"

У рамках цієї реалізації ви матимете проблеми, якщо у ваших папках / ім’ях файлів є більше одного місця, як нижче:

"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega      2"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double  space"
"C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single"

такі випадки охоплюються простими:

for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j"

2

Якщо ви використовуєте Linux або використовуєте Cygwin або MinGW у Windows, ви можете використовувати bash-подібні рішення, як описано нижче. На відміну від інших подібних, представлених тут, цей враховує пробіли імен файлів:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done

Для чого це? ШМД? Баш? Це схоже на Bash (або подібну оболонку). У цьому випадку він передбачає Linux або подібне (наприклад, MinGW або Cygwin ). ОП заявила: "Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме".
Пітер Мортенсен

Спасибі, ви праві, коли я в Windows, я використовую Cygwin з Bash. Однак твердження "Мій сервер працює під керуванням Windows Server 2003, тому рішення Unix не працюватиме". неправдиво. Можливо, він не хоче використовувати Cygwin чи MinGW, але він не висловився таким чином. Я переформулював відповідь.
Адже

1

Провівши деякий час, намагаючись зрозуміти, як рекурсивно додати лише деякі файли, я подумав, що було б дійсно поділитися тим, що працювало для мене:

FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F"
FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F"

Ось дещо пояснення.

Перша команда додає всі каталоги. Друга команда додає лише файли відповідно до заданих шаблонів.

Дозвольте мені детальніше:

  • ДЛЯ: знаєте, управління петлею.
  • / F: означає взяти файли та каталоги (точно не впевнені).
  • % F: його змінна; воно буде приймати значення кожного з перерахованих файлів одночасно; це може мати ще одне ім’я одного символу.
  • ІН: не потрібно пояснювати, правда?
  • ('dir / s / b / a: d'): команда DOS, яка перелічить каталоги; у моєму випадку / s є рекурсивним, / b означає пройти лише повний шлях, / a: d означає лише каталог; міняйте його, як хочете, зберігаючи дужки та апострофи.
  • DO: означає, що наступне в команді - це те, що буде виконуватися для кожної директорії
  • svn add --depth = порожній: це потрібна команда SVN для запуску; визначення глибини означає додавати лише каталог, а не файли всередині них.
  • "% F": саме так ви використовуєте змінну, визначену раніше.

У другій команді єдиними відмінностями є команда dir та команда svn, я думаю, що це досить зрозуміло.


0

Ви можете використовувати команду

svn add * force--

або

svn add <directory/file name>

Якщо ваші файли / каталоги не додаються рекурсивно. Потім перевірте це.

Рекурсивне додавання є властивістю за замовчуванням . Ви можете побачити у книзі SVN .

Випуск може бути у вашому списку ігнорування чи глобальних ресурсах.

Я отримав рішення трекер проблем Google

Перевірте глобальні властивості для ігнорування зірки (*)

  • Клацніть правою кнопкою миші у вікні репо. Виберіть TortoiseSVN > Properties.
  • Подивіться, чи немає у вас власності svn:global-ignores with a value of *
  • Якщо у вас є майно, star(*)тоді він буде ігнорувати рекурсивне додавання. Тому видаліть цю властивість.

Перевірте глобальну схему ігнорування для ігнорування зірки (*)

  • Клацніть правою кнопкою миші у вікні репо. Виберіть TortoiseSVN > Settings > General.
  • Дивіться у глобальному шаблоні ігнорування, якщо ви там не встановили зірку (*) .
  • Якщо ви знайшли star(*), видаліть цю властивість.

Цей хлопець також пояснив, чому цю властивість додали в мій проект.

Найбільш схожий спосіб потрапити туди - це те, що хтось правою кнопкою миші натиснув файл без будь-якого розширення і вибрав TortoiseSVN -> SVN Ignore -> * (рекурсивно), а потім зробив це.

Ви можете перевірити журнал, щоб побачити, хто скоїв цю зміну власності, дізнатися, що вони насправді намагалися зробити, і попросити їх бути більш обережними в майбутньому. :)



0

Оскільки він вказав Windows, де awk & sed не є стандартними:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

або у пакетному файлі:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

Це ледачий і небезпечний спосіб синхронізації каталогу з SVN, включаючи нові файли:

svn rm --keep-local dir
svn add dir

Хоча це може працювати в крайній мірі, це може мати і серйозні наслідки. Наприклад, SVN часто втрачає інформацію про історію файлу.

Ідеальним способом синхронізувати каталог було б мати можливість розрізняти, а потім використовувати патч svn, однак це відхиляється від форматів команди diff і команда svn diff буде порівнювати відмінності робочого каталогу, а не відмінності на рівні файлової системи.


-1

Я думаю, що я зробив щось подібне з:

svn add . --recursive

але не впевнений, чи моя пам’ять правильна ;-p


2
просто оновлення для вашої пам’яті: svn 1.4 та 1.5 не підтримують - рекурсивний як параметр для svn add :)
Людвіг Венсауер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.