Как выполнить транзакцию в Subversion и добавить новые файлы/папки и автоматически удалить старые файлы/папки?

Испорченный TortoiseSVN, теперь я использую командную строку в Linux для взаимодействия с репозиторием SVN.

В TortoiseSVN я бы просто внес изменения, и он покажет мне список того, что было добавлено, что было удалено и что было изменено. Я бы проверил все поля и нажал OK.

В командной строке мне кажется, что я должен делать svn add, когда я добавляю файлы и svn rm, когда я удаляю файлы, и когда все это делается, я набираю svn commit, и он фиксирует добавленные, удаленные и измененный.

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

Ответ 2

В Windows будет работать следующий пакетный файл:

for /f "tokens=2*" %%i in ('svn status %1 ^| find "?"') do svn add "%%i"  
for /f "tokens=2*" %%i in ('svn status %1 ^| find "!"') do svn delete "%%i"  
svn commit -m "Automatic commit" %1  

Просто сохраните три строки выше в файле с именем "autocommit.bat". Если вы запустите его из рабочего каталога, вам не нужно указывать параметр. Если вы находитесь в другом каталоге, вы можете называть его как autocommit.bat c:\MyProjectFolder.

Ответ 3

Надер Ширази имел правильную команду в размещенном script. Здесь версия для одной строки для Linux:

svn add  $(svn st | sed -n 's/^[A?] *\(.*\)/\1/p')

Я давно хотел эту функциональность и рад, что искал здесь!

Ответ 4

Нет SVN-команды, но я уверен, что есть script или два, которые могут сканировать файлы с неверсированными/отсутствующими и выдавать соответствующие команды...

Я нашел его здесь: http://gael-varoquaux.info/computers/svnautocommit/index.html

Добавление полного script

#!/bin/bash


#------------------------------- Subroutines ---------------------------------
usage(){
echo " Usage: $(basename $0) PATH"
echo ""
echo "Automatically commits the changes of svn working copy located in PATH."
echo "The new files are automatically added and the files that have been removed"
echo "are removed."
echo ""
echo "By Gael Varoquaux"
}

#------------------------------- Process the options -------------------------
if [ $# -eq 1 ]
then
    workingdir="$1"
else
    usage
    exit 1
fi

if ! cd $workingdir
then
    echo $workingdir is not a accessible path.
    usage
    exit 1
fi

#------------------------------- Find out what has changed -------------------

# A warning if this fails :
echo "SVN autocommit failed" > $HOME/local/motd

svnstatus=$(svn status $workingdir)
added=$(printf "$svnstatus" | sed -n 's/^[A?] *\(.*\)/\1/p')
removed=$(printf "$svnstatus" | sed -n 's/^! *\(.*\)/\1/p')

if [ "x$added" != "x" ]
then
    echo adding "$added" to repository
    svn add $added
fi

if [ "x$removed" != "x" ]
then
    echo removing "$removed" to repository
    svn remove $removed
fi

svn commit -m "autocommit" && rm $HOME/local/motd

Версия Python, похоже, не существует.

Вы можете изменить script, чтобы принять параметр для комментариев, но это начало. Вы также можете изменить его, чтобы быть простым способом для добавления/удаления для вас, и выполнить фиксацию вручную.

Ответ 5

Чтобы добавить:

svn status | grep "^\?" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn add

Чтобы удалить:

svn status | grep "^\!" | sed -e 's/! *//' | sed -e 's/ /\\ /g' | xargs svn remove

Это отлично работает для меня.

Ответ 6

Если вы хотите сделать это с помощью PowerShell, вот простая функция, которая использует svn status:

svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }

Кредиты отправляются в ответ на команду SVN с вопросом о переполнении стека, чтобы удалить все локально отсутствующие файлы. Я скорректировал его работу для новых файлов.

В файле PowerShell я сделал это так:

# Delete missing files
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

# Added new files
svn status | ? { $_ -match '^\?\s+(.*)' } | % { svn add $Matches[1] }

# Commit repository
svn commit -m "This commit is done by a PowerShell bat"

Ответ 7

Короче говоря, нет. Вы должны svn add и svn delete каждый элемент.

Если вы не привязаны к SVN, некоторые другие системы управления версиями предлагают эту функцию; например, Mercurials hg addremove.

Ответ 8

В то время как сжатые команды с использованием аргументов строки являются мощными, они могут пропустить (или не дать) включить имена файлов с пробелами. Следующая команда из ответ на аналогичный вопрос, который будет содержать все файлы.

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

Ответ 9

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

svn st | sed -rn '/^\?/s/^.{8}(.+)$/\1/p' | xargs -r svn add

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

svn st | sed -rn '/^!/s/^.{8}(.+)$/\1/p' | xargs -r svn rm

Описание

Это в основном сжатая версия ответа lucas, которая объединяет grep и два вызова sed в один.

СЕПГ

Смотрите также: http://www.grymoire.com/Unix/sed.html

xargs

Параметр -r (или --no-run-if-empty) для xargs (версия GNU) прекращает обработку, когда нет ввода из sed, поэтому исключая ошибку SVN Not enough arguments provided.