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

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

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

мой сервер работает Windows Server 2003 таким образом, решение Unix не будет работать.

16 ответов


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

отличный совет! Одно замечание: мой затмение автоматически добавляет новые файлы в список игнорирования. Это может быть вопрос конфигурации, но в любом случае: есть --no-ignore опция, которая помогает.

после этого, вы можете совершить:

svn commit -m 'Adding a file'

Это вопрос к шахте но там есть ответ, который относится к этому вопросу:

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

что работает это:

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

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

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

список добавленных файлов.

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


это сработало для меня:

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

(источник)

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

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

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

этот метод должен обрабатывать имена файлов, в которых есть любое число/комбинация пробелов...

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

вот объяснение того, что делает эта команда:

  • Список всех измененных файлов.
  • ограничить этот список строками с '?- в начале, то есть новые файлы.
  • удалить?'символ в начале строки.
  • удалить пробелы в начале строки.
  • передайте имена файлов в xargs чтобы запустить svn, добавьте несколько раз.

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

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


в TortoiseSVN имеет встроенную эту возможность, если вы хотите использовать решение без командной строки. Просто щелкните правой кнопкой мыши на папке верхнего уровня и выберите добавить...


svn add --force .

это добавит любой неверсионный файл в текущий каталог и все версионные дочерние каталоги.


Это, как описано в svn book и самый простой и работает идеально для меня

svn add * --force

http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html


использование:

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

поскольку этот пост помечен 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.летучая мышь!--18-->

@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

Я всегда использую:

копировать и вставить

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

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"

Если вы используете Linux или Cygwin или MinGW в windows, вы можете использовать bash-подобные решения, как показано ниже. В отличие от других подобных, представленных здесь, этот учитывает пространства имен файлов:

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

потратив некоторое время на то, чтобы выяснить, как рекурсивно добавлять только некоторые файлы, я подумал, что было бы правильно поделиться тем, что сработало для меня:

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"

вот некоторые объяснения.

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

позвольте мне дать более подробную информацию:

  • FOR: вы знаете, управление циклом.
  • / F: середины принимают файлы и каталоги (не уверен точно).
  • %F: его переменная; он будет принимать значение каждого из перечисленных файлов одновременно; он может иметь другое односимвольное имя.
  • IN: нет необходимости объяснять, верно?
  • ('dir /s /b /a:d'): команда DOS, которая будет перечислять каталоги; в моем случае /s рекурсивна, /b должен принимать только полный путь, /a:d означает только каталог; измените его, как вы хотите, сохраняя скобки и апострофы.
  • DO: означает, что следующее в команде-это то, что будет выполнено для каждого каталога
  • svn add --depth=empty: это необходимый SVN commando для запуска; определение глубины означает добавление только каталога, а не файлов внутри них.
  • "%F": Так вы используете переменную, определенную ранее.

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


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

svn add * force--

или

svn add <directory/file name>

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

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

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

у меня есть решение Google проблема tracker

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

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

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

  • щелкните правой кнопкой мыши в вашем РЕПО в окно. Выберите TortoiseSVN > Settings > General.
  • см. в глобальном шаблоне игнорирования, если вы не установили звездочка(*) там.
  • если вы нашли star(*), снять данный объект.

этот парень также пояснил, почему это свойство добавлено в мой проект.

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

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


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

svn add . --recursive

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