Как я 'svn добавить' все неверсированные файлы в SVN?
Я ищу хороший способ автоматически "svn добавить" все неверсированные файлы в рабочую копию в мой SVN-репозиторий.
У меня есть живой сервер, который может создать несколько файлов, которые должны находиться под контролем источника. Я хотел бы иметь короткий script, который я могу запустить, чтобы автоматически добавлять их, вместо того, чтобы проходить и добавлять их по одному.
Мой сервер работает Windows Server 2003, поэтому решение Unix не будет работать.
Ответы
Ответ 1
svn add --force * --auto-props --parents --depth infinity -q
Отличный совет! Одно замечание: мой Eclipse автоматически добавляет новые файлы в список игнорирования. Это может быть вопрос конфигурации, но так или иначе: есть опция --no-ignore
, которая помогает.
После этого вы можете зафиксировать:
svn commit -m 'Adding a file'
Ответ 2
Это другой вопрос для моего, но есть ответ, который относится к этому вопросу:
svn status | grep '?' | sed 's/^.* /svn add /' | bash
Ответ 3
Что работает:
c:\work\repo1>svn add . --force
Добавляет содержимое подкаталогов.
Не добавлять игнорируемые файлы.
Перечисляет, какие файлы были добавлены.
Точка в команде указывает текущий каталог, это может быть заменено на определенное имя каталога или путь, если вы хотите добавить другой каталог, чем текущий.
Ответ 4
Это сработало для меня:
svn add `svn status . | grep "^?" | awk '{print $2}'`
(Источник)
Как вы уже решили свою проблему для Windows, это решение UNIX (после Сэма). Я добавил сюда, поскольку, по-моему, он по-прежнему полезен тем, кто задает этот вопрос, задавая одно и то же (как название не включает ключевое слово "WINDOWS" ).
Примечание (февраль 2015 г.):
Как прокомментировано "bdrx", вышеуказанная команда может быть дополнительно упрощена следующим образом:
svn add `svn status . | awk '/^[?]/{print $2}'`
Ответ 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 sets {} для использования в качестве заполнителя, чтобы мы могли помещать символы вокруг имени файла по 'svn add'.
Преимущество этого метода заключается в том, что он должен обрабатывать имена файлов с пробелами в них.
Ответ 6
TortoiseSVN имеет эту возможность, если вы хотите использовать решение без командной строки. Просто щелкните правой кнопкой мыши на папке верхнего уровня и выберите Добавить...
Ответ 7
Использование:
svn st | grep ? | cut -d? -f2 | xargs svn add
Ответ 8
svn add --force .
Это добавит какой-либо неверсированный файл в текущий каталог и все дочерние директории с версией.
Ответ 9
Это так же задокументировано в svn-книге, и простейшее и прекрасно работает для меня
svn add * --force
http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html
Ответ 10
Поскольку этот пост отмечен Windows, я думал, что разработаю решение для Windows. Я хотел автоматизировать процесс, и я сделал файл bat. Я сопротивлялся созданию console.exe в С#.
Я хотел добавить любые файлы или папки, которые не были добавлены в мой репозиторий, когда я начинаю процесс фиксации.
Проблема со многими ответами заключается в том, что они будут перечислять неверсированные файлы, которые следует игнорировать в соответствии с моим списком игнорирования в TortoiseSVN.
Вот мой параметр hook и командный файл, который делает это
Черепаха-крючок Script:
"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
Ответ 11
Я всегда использую:
Копировать & вставка
svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
Ответ 12
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"
Ответ 13
Если вы используете Linux или используете Cygwin или MinGW в Windows, вы можете использовать bash -подобные решения, например, следующие. В отличие от других подобных, представленных здесь, это учитывает пространства имен файлов:
svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done
Ответ 14
Проведя некоторое время, пытаясь понять, как рекурсивно добавить только некоторые из файлов, я подумал, что было бы справедливо поделиться тем, что для меня работало:
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: его переменная; он будет принимать значение каждого из перечисленных файлов за раз; у него может быть другое односимвольное имя.
- IN: не нужно объяснять, правильно?
- ('dir/s/b/a: d'): команда DOS, которая будет перечислять каталоги; в моем случае /s является рекурсивным, /b - принимать только полный путь, /a: d означает только каталог; измените его, как вы хотите сохранить скобки и апострофы.
- DO: означает, что то, что будет дальше в команде, будет выполнено для каждого каталога
- svn add --depth = empty: это желаемое командование SVN; определение глубины означает добавление только каталога, а не файлов внутри них.
- "% F": это то, как вы используете переменную, определенную ранее.
Во второй команде единственными отличиями являются команда dir и команда svn, я думаю, что это достаточно ясно.
Ответ 15
Я думаю, что я сделал что-то похожее:
svn add . --recursive
но не уверен, что моя память верна; -p