Как я '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 .

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

Ответ 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