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

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

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

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

 Neutrino13 февр. 2014 г., 13:03
@ Saul Этот вопрос явно предшествует тому, который вы связали, поэтому я не понимаю, как это может быть дубликатом. Во всяком случае, другой вопрос - дубликат.
 user15184103 дек. 2014 г., 03:02
Cygwin это вариант. Дает вам силу bash в любой среде Windows. Уже более 10 лет пользователь с очень незначительными проблемами.

Ответы на вопрос(18)

Это другой вопрос к моему но есть ответ на этот вопрос:

svn status | grep '?' | sed 's/^.* /svn add /' | bash
 Asbjørn Ulsberg29 мар. 2011 г., 18:40
Я с mbyrne215; Этот ответ помог мне больше, чем решение ОП, поэтому я голосую за него. Отлично работает в OS X 10.6.7.
 Naaff02 июл. 2009 г., 01:55
При этом используются инструменты UNIX (grep, sed, bash), которых, по словам ОП, у него не было.
 Sam Saffron02 июл. 2009 г., 14:19
@ Йоханнес только для тебя Meta.stackexchange.com / вопросы / 1775 / ...
 Joey02 июл. 2009 г., 12:09
Извините за это возражение в комментарии Cygwin, не было намеренным (и я не могу отменить это). На самом деле я думаю, что Cygwin настолько уродлив, насколько вы можете получить на Windows. Вы можете по-прежнему использовать findstr вместо grep, который будет работать по крайней мере начиная с Windows 2000, не устанавливая ничего дополнительного.
 Sam Saffron02 июл. 2009 г., 07:13
Кроме того, вы могли бы, вероятно, выкопать sed и grep на окнах.
svn add --force .

дочерние каталоги.

что задокументировано в svn book, и самое простое, и идеально подходит для меня.

svn add * --force

http: //svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.htm

Вы можете ввести следующую команду в Linux:

find ./ -name "*." | xargs svn add

вы можете использовать bash-подобные решения, подобные следующим. В отличие от других подобных, представленных здесь, этот учитывает пространства имен файлов:

svn status| grep ^? | while read line ; do  svn add "`echo $line|cut --complement -c 1,2`" ;done
 Peter Mortensen29 нояб. 2016 г., 18:47
Для чего это? CMD? Bash? Похоже на Bash (или похожую оболочку). В этом случае он предполагает Linux или аналогичный (например, MinGW или Cygwin). ОП заявил: "Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать."
 ajaest02 дек. 2016 г., 14:11
Спасибо, вы правы, когда я в Windows, я использую Cygwin с Bash. Однако утверждение «Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать». ложно Возможно, он не хочет использовать Cygwin или MinGW, но он не выразил себя таким образом. Я переформулировал ответ.
Решение Вопроса

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

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

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

svn commit -m 'Adding a file'
 vsync05 нояб. 2014 г., 16:12
@ Name - нужно поставить* в конце концов, иначе это не сработает (для меня в аренду)
 MrDuk21 февр. 2014 г., 05:42
Есть ли простой способ установить это в сокращенный макрос (то есть, как вы можете с помощью git)? Кроме того, можно ли обновить этот ответ, чтобы он объяснял каждый бит?
 Name29 окт. 2012 г., 16:49
Отличный совет. Гораздо лучше, чем использование статуса SVN. "svn add --force" кажется достаточным.
 ladieu20 мар. 2014 г., 20:52
Вопрос: добавляет ли это игнорируемые файлы правильно? Не желательно.
 Ronan18 мар. 2014 г., 12:47
@ MrDuk: укорочено:alias magic="svn add --force * --auto-props --parents --depth infinity -q" - объяснил:svn help add

Вы можете использовать команду

svn add * force--

ил

svn add <directory/file name>
Если ваши файлы / каталоги не добавляются рекурсивно. Тогда проверьте это.

Рекурсивное добавление является свойством по умолчанию. Вы можете увидеть вSVN book.

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

Я нашел решениеgoogle tracker

Проверьте глобальные свойства для игнорирования звездочки (*) Щелкните правой кнопкой мыши в своем репо в окне. ВыбратьTortoiseSVN > Properties. Смотрите, если у вас нет собственностиsvn:global-ignores with a value of * Если у тебя есть собственность сstar(*) тогда он будет игнорировать рекурсивное добавление. Так что удалите это свойство. Проверьте глобальный шаблон игнорирования для игнорирования звездочки (*) Щелкните правой кнопкой мыши в своем репо в окне. ВыбратьTortoiseSVN > Settings > General. См. Global Ignore Pattern, если вы не установилиstar (*) там Если ты нашелstar(*), удалите это свойство.

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

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

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

Это сработало для меня:

svn add `svn status . | grep "^?" | awk '{print $2}'`

(Источни)

Поскольку вы уже решили свою проблему для Windows, это решение UNIX (вслед за Сэмом). Я добавил здесь, так как считаю, что он все еще полезен для тех, кто задает этот вопрос и спрашивает об одном и том же (поскольку заголовок не включает ключевое слово «WINDOWS»).

Заметк (Февраль 2015 г.): Как прокомментировал "bdrx", приведенная выше команда может быть еще более упрощена следующим образом:

 svn add `svn status . | awk '/^[?]/{print $2}'`
 lepe27 февр. 2015 г., 01:45
@ bdrx: Возможно, потому что grep обычно ассоциируется с сопоставлением с образцом? В моем личном случае, я гораздо опытнее с grep, чем с awk. Я не знал, что вы могли бы делать такие вещи в awk, поэтому я начну использовать awk больше в моих скриптах. Благодарность
 Norman H23 февр. 2012 г., 14:38
Nice, компактный, лаконичный, также хорошо поддается расширению. Благодарность
 Jeff14 июн. 2012 г., 18:06
Идеально для того, что мне нужно. Спасибо
 Drewid18 апр. 2012 г., 16:43
Большой. Также легко расширить, изменить, удалить и т. Д.
 bdrx26 февр. 2015 г., 14:59
Почему люди всегда ворчат, а потом отправляют в awk? Awk может сделать сопоставление с образцом:awk '/^[?]/{print $2}'; Нет необходимости в дополнительном процессе grep.

USE:

svn st | grep ? | cut -d? -f2 | xargs svn add
 Eric309 июн. 2011 г., 18:53
Или вы можете использовать cut для работы grep:svn status | cut -d ? -f 2 -s | xargs svn add
 Peter Mortensen29 нояб. 2016 г., 18:40
Это предполагает Linux или аналогичный (например, MinGW или Cygwin). ОП заявил: "Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать."

sed не являются стандартными:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

или в пакетном файле:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

в которых есть любое число / комбинация пробелов ...

svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\"

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

Перечислите все измененные файлы. Ограничить этот список до строк с '?' в начале - то есть новые файлы.Удалить '?' символ в начале строки. Удалите пробелы в начале строки. Вставьте имена файлов в xargs, чтобы запустить svn add несколько раз.

Используйте аргумент -i для xargs, чтобы иметь возможность импортировать имена файлов с пробелами в 'svn add' - в основном, -i устанавливает {} для использования в качестве заполнителя, чтобы мы могли поместить «символы вокруг имени файла, используемого» svn add '.

Преимущество этого метода в том, что он должен обрабатывать имена файлов с пробелами в них.

 Peter Mortensen29 нояб. 2016 г., 18:45
Это предполагает Linux или аналогичный (например, MinGW или Cygwin). ОП заявил: "Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать."

Копировать вставит

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1
 Neutrino27 авг. 2012 г., 16:46
Откровенность гласит, что решение Unix для него бесполезно.
 Peter Mortensen29 нояб. 2016 г., 18:45
Это предполагает Linux или аналогичный (например, MinGW или Cygwin). ОП заявил: "Мой сервер работает под управлением Windows Server 2003, поэтому решение Unix не будет работать."

я подумал, что смогу найти решение для Windows. Я хотел автоматизировать процесс, и я сделал файл bat. Я сопротивлялся созданию console.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.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
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"

пытаясь выяснить, как рекурсивно добавить только некоторые файлы, я подумал, что было бы правильно поделиться тем, что сработало для меня:

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 для запуска; определение глубины означает добавление только каталога, а не файлов внутри них. "% F": так вы используете переменную, определенную ранее.

Во второй команде единственные различия - это команда dir и команда svn, я думаю, это достаточно ясно.

Вот что работает:

c:\work\repo1>svn add . --force

Добавляет содержимое подкаталогов.

Не добавляет игнорируемые файлы.

Список файлов, которые были добавлены.

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

 Nux12 февр. 2014 г., 15:01
На самом деле это должно быть.\* или если svn root находится в другом каталогеstuff\svn_root\*.
 Neutrino03 янв. 2017 г., 14:43
@ Nux Только теперь, после всех этих лет, я наконец вижу, к чему вы клонили :) В команде точка - это путь, который указывает текущий каталог. Естественно, вместо этого может быть предоставлена любая действительная альтернатива.
 Nux14 февр. 2014 г., 21:03
Я указывал на то, что у вас, вероятно, нет всего диска C в SVN ;-), и поэтому вы должны добавить путь. И из моего тестирования, указав путь какstuff\svn_root не добавляет файлы в подкаталоги (например, вstuff\svn_root\already_in_svn\not_in_svn.txt). Отсюда и звезда в конце.
 Neutrino13 февр. 2014 г., 12:59
Я не слежу. Команды для SVN выполняются в контексте пути, из которого они выполняются, этого следует ожидать. «svn add. \ *» сам по себе не рекурсивно и печатает множество предупреждающих спамов, делая невозможным просмотр того, что на самом деле было добавлено. "svn add. \ * --force" выполняет рекурсию, но также печатает "svn: Пропуск аргумента: E200025: '. \. svn' заканчивается зарезервированным именем". Так что это кажется хуже, чем мое первоначальное решение.
 csonuryilmaz03 дек. 2016 г., 10:31
Спасибо, коротко и легко запомнить!

TortoiseSVN имеет встроенную возможность, если вы хотите использовать решение без командной строки. Просто щелкните правой кнопкой мыши на папке верхнего уровня и выберитеДобавлят ...

 Upendra14 мар. 2016 г., 09:24
С огромным репозиторием TortoiseSVN зависает. Это заставило меня искать альтернативы командной строки: -)

Я думаю, что сделал нечто похожее с:

svn add . --recursive

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

 Ludwig Wensauer17 мая 2010 г., 10:04
просто обновление вашей памяти: SVN 1.4 и 1.5 не поддерживают --recursive в качестве параметра для SVN Add:)

Ваш ответ на вопрос