如何有效使用 SVN CLI

如何有效使用 SVN CLI

如何使用 SVN CLI 提高工作效率?我需要完成这样的重复性任务:

  • 在目录中查找修改过的文件
  • 只提交其中的一些
    • 以某种方式选择他们,然后记住他们的名字
  • 列出未版本控制的文件
    • 仅使用一些有效的方式添加一些,然后记住它们
  • 仅恢复特定目录中的部分文件

我习惯了 Windows 上的 TortoiseSVN,但是切换到 OSX(非常类似于 Linux)迫使我使用 SVN 的 CLI,因为其他客户端很糟糕或非常昂贵。

答案1

我遇到了类似的问题。我的方法是为我执行的最常见操作编写 shell 别名或函数。作为参考,这些是 ZSH shell 函数。这些函数本身也应该在 bash 中工作,但 shell 完成的内容会有所不同。

在查看您的使用情况时,您想要执行的“选择某些”操作与我的使用情况不同,并且没有任何规定。实际上,我建议您修改修订控制的使用,以进行更频繁的提交,并利用存储库中的多个工作副本或分支来跟踪选择性更改集。如果您在目录中工作,那么您在那里所做的一切都应该选择性地提交或恢复,但不应留下太多内容。在任何给定时刻提交您所拥有的内容,并使用版本控制功能来处理产品中的内容或不包含的内容。

为了使其工作,您可以将代码放入您的~/.zshrc文件中(或~/.bashrcbash)。

这是我(每天)使用的主要功能:

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 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
}

通过查看这段代码,它确实表明我在很多年前编写了这些代码,当时我刚刚开始使用版本控制,并且在 shell 中不太优雅,但它应该仍然可以工作。

答案2

利用你的外壳完成。 Bash 有一些补全功能svn,zsh 的明显更好。例如,在 zsh 中,svn add <TAB>仅完成尚未注册的文件,svn commit <TAB>仅列出已注册且有更改的文件,等等。仅此一项就可以满足您的大部分要求:

  • 在目录中查找修改后的文件 →svn statussvn commit <TAB>
  • 只提交其中的一些 →svn commit <TAB>
  • 列出未版本控制的文件 →svn statussvn 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'

您可能希望在提示中包含一些版本控制信息,例如 zsh 的vcsinfo

相关内容