Как эффективно использовать SVN CLI

Как я могу сделать себя более продуктивным с помощью SVN CLI? Мне нужно выполнить такие повторяющиеся задачи:

  • найти измененные файлы в каталоге
  • фиксировать только НЕКОТОРЫЕ из них
    • выбирая их как-то иначе, чем вспоминая их имена
  • список неверсированных файлов
    • добавьте только некоторые, используя какой-то эффективный способ, а затем запомнить их
  • возвращать только некоторые файлы в определенном каталоге

Я привык к TortoiseSVN в Windows, но переход на OSX (который довольно похож на Linux) заставил меня использовать CLI SVN, поскольку другие клиенты плохи или действительно дороги.

  • Перезапуск пользовательского демона при обновлении зависимостей
  • AIX и Subversion
  • Владельцы файлов svn и webserver
  • Linux, SVN и Dropbox. В какой каталог должен храниться мой репозиторий svn?
  • Какой клиент GUI svn позволяет выполнять поиск по истории?
  • / scripts / installimagemagick теперь устарела
  • Связывание определенного IP-адреса с портом в apache2
  • Как сделать apr доступным для установки subversion?
  • 2 Solutions collect form web for “Как эффективно использовать SVN CLI”

    У меня возникают аналогичные проблемы. Мой подход заключался в написании псевдонимов оболочки или функций для наиболее распространенных действий, которые я предпринимаю. Для справки, это функции оболочки ZSH. Сами функции также должны работать в bash, но материал для завершения оболочки будет другим.

    При просмотре вашего использования действие «выбрать какое-то», которое вы хотите принять, зависит от моего использования, и для него нет никаких условий. Я бы на самом деле предложил вам изменить использование контроля версий для более частых коммитов и использовать несколько рабочих копий или филиалов в репозитории для отслеживания выборочных наборов изменений. Если вы работаете в каталоге, все, что вы там делаете, должно быть совершено или отменено на выборочной основе, но не стоит много сидеть. Зафиксируйте то, что у вас есть в любой момент, и используйте функции контроля версий для обработки того, что входит в продукт или нет.

    Чтобы это сработало, вы поместите код в свой файл ~/.zshrc (или ~/.bashrc для bash).

    Вот основная функция, которую я использую (каждый день):

     function svnlist () { if [ -z "$2" ]; then case $1 in clobered) svn status | grep '^~' | cut -c9- ;; missing) svn status | grep '^\!' | cut -c0- ;; unknown) svn status | grep '^\?' | cut -c9- ;; conflicted) svn status | grep '^C' | cut -c9- ;; esac else case $2 in add) $0 unknown | xargs -iX svn add "X" ;; del) $0 missing | xargs -iX svn del "X" ;; revert) $0 conflicted | xargs -iX svn revert "X" ;; resolved) $0 conflicted | xargs -iX svn resolved "X" ;; unclober) mkdir _tmp $0 clobered | while read item; do mv "$item" _tmp svn del "$item" done svn ci -m "Unclobering files. (removing old)" mv _tmp/* . rmdir _tmp $0 unknown add svn ci -m "Unclobering files. (adding new)" ;; esac fi } alias svndiff="svn diff -x -b | colordiff" compctl -x 'p[1]' -k '(missing unknown conflicted clobered)' - 'p[2]' -k '(add del revert resolved)' -- svnlist 

    Это должно позволить вам запускать что-то вроде svnlist unknown чтобы найти все файлы в текущем каталоге, которые не были svnlist unknown add и svnlist unknown add чтобы добавить их все. svnlist clobered revert найдет все файлы, которые были добавлены после обновления, и вернет их. svnlist conflicted resolved , помечает все конфликты как разрешенные. svnlist missing del будет отмечать любые файлы, отсутствующие в действии, как удаленные в репозитории.

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

     function svneditlog () { rev=$1 if ! echo $rev | pcregrep '^[0-9]+$'; then echo "Invalid usage. svneditlog REV" return fi svn info | grep ^URL: | awk '{print $2}' | read url svn propedit -r $rev --revprop svn:log $url } 

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

    Используйте завершение вашей оболочки. У Bash есть некоторое завершение для svn , zsh значительно лучше. Например, в zsh, svn add <TAB> завершает только файлы, которые еще не зарегистрированы, svn commit <TAB> перечисляет только зарегистрированные и имеющие изменения файлы и т. Д. Это одно должно дать вам большую часть того, что вы спрашиваете:

    • найти измененные файлы в каталоге → svn status или svn commit <TAB>
    • commit only НЕКОТОРЫЕ из них → svn commit <TAB>
    • список неверсированных файлов → svn status svn add <TAB> или svn add <TAB>
    • добавить только некоторые → svn add <TAB>
    • возвращать только некоторые файлы в определенном каталоге → svn revert <TAB>

    Определите псевдонимы и функции для команд, которые вы используете чаще всего. Вот некоторые из них, которые я использую в zsh (обратите внимание, что я перехожу к VC-агностическим псевдонимам, это быстрые клавиши svn, аналогичные ярлыкам CVS, которые я использовал в течение десятилетия или около того).

     ## Show file status (excluding non-controlled files) alias svns='svn status > >(grep -v "^?")' ## Show the status of modified files (in particular, to notice potential conflicts in the next update) svnm () { [[ $# -ne 0 ]] || set . svn merge -r BASE:HEAD --dry-run "$@" | sed -e '/^-/d' return $pipestatus[1] } ## log (in chronological order) svnl () { local since="1" cmd arg= ret=0 if [[ $1 = <1900->-<1-12>-<1-31> ]]; then since="{$1}" shift elif [[ $1 = <1-> ]]; then since=$1 shift fi cmd=(svn log -r$since:HEAD) while [[ $1 = -* ]]; do cmd=($cmd $1) shift done if [[ $# -ne 0 ]]; then for arg; do $cmd[@] $1 ret=$((ret > $? ? $ret : $?)) done return $ret else $cmd[@] fi } ## log (from the start of the present branch or the last move) alias svnlb='svnl --stop-on-copy' 

    Возможно, вы захотите включить в свою подсказку некоторую информацию о контроле версии с помощью vcsinfo zsh.

    Linux и Unix - лучшая ОС в мире.