Как мне зафиксировать в Subversion и добавить новые файлы / папки и автоматически удалить старые файлы / папки? - PullRequest
10 голосов
/ 31 июля 2009

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

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

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

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

Ответы [ 9 ]

9 голосов
/ 27 мая 2011

В 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.

6 голосов
/ 30 октября 2012

Надер Ширази выполнил правильную команду в опубликованном сценарии . Вот однострочная версия для Linux:

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

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

3 голосов
/ 31 июля 2009

Добавить:

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

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

3 голосов
/ 31 июля 2009

Со стандартными инструментами SVN такой вещи нет - она ​​упоминается в FAQ как плохая вещь.

3 голосов
/ 31 июля 2009

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

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

Добавление полного скрипта

#!/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, к сожалению, отсутствует.

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

1 голос
/ 27 августа 2015

Если вы хотите сделать это с 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"
0 голосов
/ 12 декабря 2017

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

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

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

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

Объяснение

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

СЭД

  • -r использует расширенные регулярные выражения
  • -n не проходит через вход
  • фильтры строки, начинающиеся с ? или ! (/^\?/ и /^!/ соответственно)
  • вырезает первые 8 символов (содержащие флаги): s/^.{8}//
  • печатает остаток строки на выходе: s/(.+)$/\1/p

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

xargs

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

0 голосов
/ 11 февраля 2016

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

svn add --force * --auto-props --parents --depth infinity -q
0 голосов
/ 31 июля 2009

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

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

...