Как добавить все неверсионные файлы в 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 .
это добавит любой неверсионный файл в текущий каталог и все версионные дочерние каталоги.
поскольку этот пост помечен 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
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