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


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

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

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

16 164

16 ответов:

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

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

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

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 \"{}\"

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

  • Список всех измененных файлов.
  • ограничьте этот список строками с '?- в самом начале-то есть новые файлы.
  • удалить?'символ в начале строки.
  • удалить пробелы в начале строки.
  • Pipe имена файлов в 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.летучая мышь

@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 book.

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

я получил решение Google issue tracker

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

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

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

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

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

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

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

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

svn add . --recursive

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