Как мне 'svn добавить' все неверсионные файлы в SVN?
Я ищу хороший способ автоматически "добавить svn" все неверсионные файлы в рабочей копии в мой репозиторий SVN.
У меня есть живой сервер, который может создать несколько файлов, которые должны быть под контролем системы управления версиями. Я хотел бы иметь короткий скрипт, который я могу запустить, чтобы автоматически добавить их, вместо того, чтобы проходить и добавлять их по одному.
мой сервер работает Windows Server 2003 таким образом, решение Unix не будет работать.
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 .
это добавит любой неверсионный файл в текущий каталог и все версионные дочерние каталоги.
поскольку этот пост помечен 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
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 -> * (рекурсивно), а затем совершил это.
вы можете проверить журнал, чтобы увидеть, кто совершил это свойство изменить, находить выясните, что они на самом деле пытались сделать, и попросите их быть больше осторожнее в будущем. :)