Как мне svn добавить все неверсированные файлы в SVN?


177

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

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

Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать.


1
@Saul Этот вопрос явно предшествует тому, который вы связали, поэтому я не понимаю, как это может быть дубликатом. Во всяком случае, другой вопрос - дубликат.
Нейтрино,

Cygwin это вариант. Дает вам силу bash в любой среде Windows. Уже более 10 лет пользователь с очень незначительными проблемами.
user151841

Ответы:


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
Ронан

17
Проблема это добавляет игнорируемые файлы правильно? Не желательно
Ladieu

1
@Name - нужно поставить *в конце, иначе это не сработает (у меня в аренде)
vsync

72

Это другой мой вопрос, но там есть ответ на этот вопрос:

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

8
Для этого используются инструменты UNIX (grep, sed, bash), которых, по словам ОП, у него не было.
Нааф

3
Кроме того, вы могли бы, вероятно, выкопать sed и grep на окнах, если вы действительно хотите.
Сэм Шафран

1
Извините за это возражение на комментарий Cygwin, не было намеренным (и я не могу отменить это). На самом деле я думаю, что Cygwin настолько уродлив, насколько вы можете получить на Windows. Вы можете по-прежнему использовать findstr вместо grep, который будет работать по крайней мере начиная с Windows 2000, не устанавливая ничего дополнительного.
Джои

@Johannes только для вас meta.stackexchange.com/questions/1775/…
Сэм Шафран,

2
Я с mbyrne215; этот ответ помог мне больше, чем решение ОП, поэтому я голосую за него. Отлично работает в OS X 10.6.7.
Асбьерн Ульсберг,

37

Что работает, это:

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

Добавляет содержимое подкаталогов.

Не добавляет игнорируемые файлы.

Перечисляет, какие файлы были добавлены.

Точка в команде указывает текущий каталог, его можно заменить конкретным именем или путем, если вы хотите добавить каталог, отличный от текущего.


На самом деле это должно быть, .\*или если svn root находится в другом каталоге 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 (вслед за Сэмом). Я добавил здесь, так как считаю, что он все еще полезен для тех, кто задает этот вопрос и спрашивает об одном и том же (поскольку заголовок не включает ключевое слово «WINDOWS»).

Примечание (февраль 2015 г.): Как прокомментировал "bdrx", приведенная выше команда может быть еще более упрощена следующим образом:

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

1
Хороший, компактный, лаконичный, также хорошо поддается расширению. Спасибо.
Норман Х

1
Отлично. Также легко расширить, изменить, удалить и т. Д.
Drewid

Идеально подходит для того, что мне нужно. Спасибо!
Джефф

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

1
@bdrx: Возможно, потому что grep обычно ассоциируется с сопоставлением с образцом? В моем личном случае, я гораздо опытнее с grep, чем с awk. Я не знал, что вы могли бы делать такие вещи в 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 add несколько раз.

Используйте аргумент -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. Я сопротивлялся созданию console.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

Для чего это? CMD? Bash? Похоже на Bash (или похожую оболочку). В этом случае предполагается использование Linux или аналогичного ПО (например, MinGW или Cygwin ). ОП заявил: «Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать».
Питер Мортенсен,

Спасибо, вы правы, когда я в Windows, я использую Cygwin с Bash. Однако утверждение «Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать». ложно Может быть, он не хочет использовать Cygwin или MinGW, но он не выразил себя таким образом. Я переформулировал ответ.
ajaest

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 = empty: это требуемая команда SVN для запуска; определение глубины означает добавление только каталога, а не файлов внутри них.
  • «% F»: так вы используете переменную, определенную ранее.

Во второй команде единственные различия - это команда dir и команда svn, я думаю, это достаточно ясно.


0

Вы можете использовать команду

svn add * force--

или

svn add <directory/file name>

Если ваши файлы / каталоги не добавляются рекурсивно. Тогда проверь это.

Рекурсивное добавление является свойством по умолчанию . Вы можете увидеть в книге SVN .

Проблема может быть в вашем списке игнорирования или в глобальных свойствах.

Я получил решение гугл трекер

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

  • Щелкните правой кнопкой мыши в вашем репо в окне. Выберите TortoiseSVN > Properties.
  • Смотрите, если у вас нет собственности svn:global-ignores with a value of *
  • Если у вас есть свойство с, star(*)то он будет игнорировать рекурсивное добавление. Так что удалите это свойство.

Проверьте глобальный шаблон игнорирования для игнорирования звезды (*)

  • Щелкните правой кнопкой мыши в вашем репо в окне. Выберите TortoiseSVN > Settings > General.
  • Смотрите в Global Ignore Pattern, если вы не установили там звездочку (*) .
  • Если вы нашли 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 часто теряет историю файла.

Идеальный способ синхронизировать каталог - это иметь возможность использовать diff, а затем использовать svn patch, однако это отличается от форматов в команде diff, и команда svn diff будет сравнивать различия рабочих каталогов, а не различия на уровне файловой системы.


-1

Я думаю, что я сделал нечто подобное с:

svn add . --recursive

но не уверен, что моя память верна ;-p


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