Добавьте все неверсированные файлы в Subversion с помощью одной команды Linux - PullRequest
52 голосов
/ 02 августа 2009

Иногда я включаю много файлов в разных каталогах в свой проект. Сейчас я добавляю все файлы один за другим в свой проект перед коммитом. Есть ли какая-нибудь команда терминала Linux, которая может добавить все неверсированные файлы в Subversion?

А что, если я хочу добавить все файлы, кроме одного или двух файлов?

Ответы [ 11 ]

79 голосов
/ 02 августа 2009
svn add --force <directory>

Добавление уже рекурсивно. Вам просто нужно заставить его пересмотреть версионные подкаталоги.

27 голосов
/ 02 августа 2009

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

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
svn commit

http://codesnippets.joyent.com/posts/show/45

22 голосов
/ 04 сентября 2013

Это попытается добавить все файлы - но только фактически добавить те, которых еще нет в SVN:

svn add --force ./* 
12 голосов
/ 03 октября 2012

Эта команда добавит все не версионные файлы, перечисленные в выводе команды svn st, в subversion.

Обратите внимание, что любые имена файлов, содержащие пробелы в выводе 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 команда

[user@xxx rails]$svn st
?       app/controllers/application.rb
M       app/views/layouts/application.html.erb
?       config/database.yml

Шаг 2: Мы извлекаем файл без версии командой grep:

[user@xxx rails]$svn st | grep ?
?       app/controllers/application.rb
?       config/database.yml

Шаг 3: Затем удалите сжатие пробела между ? и путем к файлу с помощью команды tr:

<code>[user@xxx rails]$svn st | grep ? | tr -s ' '
? app/controllers/application.rb
? config/database.yml

Шаг 4: Затем выберите второй столбец из вывода, используя команду вырезания:

[user@xxx rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2
app/controllers/application.rb
config/database.yml

Шаг 5: Наконец, передав эти пути к файлам в качестве стандартного ввода в команду svn add:

[user@xxx rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add
A       app/controllers/application.rb
A       config/database.yml
9 голосов
/ 02 августа 2009

По умолчанию команда svn add является рекурсивной. Просто укажите его в директории верхнего уровня вашего проекта, и он должен добавить любой файл, которого там еще нет.

Возможно, вы захотите включить опцию --force, но имейте в виду, что это также добавит файлы, которые в противном случае будут исключены из-за svn: ignore (если вы не используете svn: ignore, то у вас не будет любые вопросы).

1 голос
/ 01 ноября 2017

Никто из вас, ребята, не полностью прав Я провожу целую ночь, чтобы исправить это, и он работает нормально в моих джинсах:

svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents
svn commit
  1. состояние
  2. удалить .svn
  3. найти? в начале строки, чтобы определить, является ли он неверсированным (измените его на | grep "^? [\ t] *. * cpp" | добавит только cpp)
  4. удалить? (одна из приведенных выше тем проблема awk, вы можете попробовать используйте вместо этого tr или sed)
  5. заменить заставку на заставку linux (необязательно, нужно cygwin)
  6. заключить строку с цитатой
  7. вызовите xargs (вы должны добавить --parent, чтобы убедиться, что вложенные папки среднего уровня также добавляются, если вы пытаетесь фильтровать cpp или определенный шаблон файла)
1 голос
/ 02 июня 2013

Подход, использующий Perl в одну строку для добавления всех файлов, отмеченных знаком вопроса "svn st", будет выглядеть так:

svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add

Thisтакже должен работать с пробелами в именах файлов.

1 голос
/ 07 апреля 2013

Вышеупомянутое решение с 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'

заключает имена файлов в кавычки.

0 голосов
/ 27 января 2013

Этот сценарий оболочки рекурсивно проверяет (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
0 голосов
/ 07 октября 2012

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

svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add

Я выбрал команду cut -c9-, чтобы избавиться от начальных пробелов и предполагая, что команда svn st начнет имя файла с 9-го символа на всех машинах. Если вы не уверены, сначала протестируйте эту часть команды.

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