Ответ 1
svn add --force <directory>
Добавить уже рекурсивный. Вам просто нужно заставить его перемещаться по версиям подкаталогов.
Иногда я включаю много файлов в разные каталоги в моем проекте. На данный момент я добавляю все файлы по одному в свой проект перед фиксацией. Есть ли какая-либо команда терминала Linux, которая может добавить все неперевернутые файлы в Subversion?
И что, если я хочу добавить все файлы, кроме одного или двух файлов?
svn add --force <directory>
Добавить уже рекурсивный. Вам просто нужно заставить его перемещаться по версиям подкаталогов.
Добавляет любой файл с вопросительным знаком рядом с ним, все еще исключая игнорируемые файлы:
svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit
Это попытается добавить все файлы, но только на самом деле добавить те, которые еще не находятся в SVN:
svn add --force ./*
Эта команда добавит любые файлы без версии, перечисленные в выводе команды svn st
, к подрывной деятельности.
Обратите внимание, что никакие имена файлов, содержащие пробелы в файле svn stat, не будут добавлены. Кроме того, может возникнуть нечетное поведение, если какие-либо имена файлов содержат "?".
svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add
или если вы хорошо разбираетесь в awk:
svn st | grep ? | awk '{print $2}' | xargs svn add
Пояснение:
Шаг 1: svn st
команда
[[email protected] rails]$svn st
? app/controllers/application.rb
M app/views/layouts/application.html.erb
? config/database.yml
Шаг 2:. Мы загружаем файл без версии с командой grep
:
[[email protected] rails]$svn st | grep ?
? app/controllers/application.rb
? config/database.yml
Шаг 3: Затем удалите сжатие между ?
и файловым путем с помощью команды tr:
[[email protected] rails]$svn st | grep ? | tr -s ' '
? app/controllers/application.rb
? config/database.yml
</pre>
Шаг 4: Затем выберите второй столбец из вывода с помощью команды cut:
[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2
app/controllers/application.rb
config/database.yml
Шаг 5: Наконец, передача этих путей файлов в качестве стандартного ввода в команду svn add
:
[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add
A app/controllers/application.rb
A config/database.yml
По умолчанию команда svn add
рекурсивна. Просто укажите его в каталог верхнего уровня вашего проекта, и он должен добавить любой файл, который еще не существует.
Возможно, вы захотите включить параметр --force
, но имейте в виду, что это также добавит файлы, которые в противном случае будут исключены из-за svn: ignore (если вы не используете svn: ignore, то у вас не будет любые проблемы).
Вышеупомянутое решение с awk '{print $2}'
, к сожалению, не работает, если файлы содержат пробелы. В этом случае это прекрасно работает:
svn st | grep "^?" | sed 's/^?[ \t]*//g' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn add
где
sed 's/^?[ \t]*//g'
удаляет знак вопроса и пустые символы с самого начала и
sed 's/^/"/g' | sed 's/$/"/g'
содержит имена файлов с кавычками.
Подход с использованием Perl one-liner добавить все файлы, показанные с помощью вопросительного знака на "svn st", будет:
svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add
Это также должно работать с символами пробела в именах файлов.
Никто из вас, парни, не полностью прав Я провожу целую ночь, чтобы исправить это, и он работает правильно в моих дженкинсах:
svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents
svn commit
Эта версия вышеприведенных команд учитывает случай, когда переданные файлы или пути к ним содержат пробелы. Однако эта команда все равно будет терпеть неудачу, если путь содержит одну цитату.
svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add
Я пошел на cut -c9-, чтобы избавиться от ведущих пробелов и предположил, что команда svn st начнет имя файла на 9-м символе на всех машинах. Если вы не уверены, сначала проверьте эту часть команды.
Эта оболочка script, рекурсивно исследует (svn status
) каталоги в вашем проекте, удаляя отсутствующие файлы и, добавляя новые файлы в репозиторий. Это своего рода "хранилище в хранилище, текущий моментальный снимок проекта".
if [ $# != 1 ]
then
echo "usage: doSVNsnapshot.sh DIR"
exit 0
fi
ROOT=$1
for i in `find ${ROOT} -type d \! -path "*.svn*" `
do
echo
echo "--------------------------"
( cd $i ;
echo $i
echo "--------------------------"
svn status | awk '
/^[!]/ { system("svn rm " $2) }
/^[?]/ { system("svn add " $2) }
'
)
echo
done
Я не использовал SVN. Но следующее должно работать.
svn add foo/bar.file bar/foo.file
Это должно добавить файл bar.file
в каталог foo
и foo.file
, существующий в каталоге bar
.
И svn add foo
должен добавить все файлы в foo
к серверу. Флаг "рекурсивный" устанавливается по умолчанию.
И чтобы добавить все файлы в каталог, за исключением нескольких (например, файлы, начинающиеся/заканчивающиеся на ключевые слова tmp
, test
и т.д.), я не думаю, что есть более чистый/более простой способ сделать это, и лучше написать оболочку script, которая делает это.