如何有效地使用 SVN CLI

Tom*_*far 7 osx bash subversion

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

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

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

Cal*_*leb 4

我遇到了类似的问题。我的方法是为我执行的最常见操作编写 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
Run Code Online (Sandbox Code Playgroud)

这应该允许您运行类似的操作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
}
Run Code Online (Sandbox Code Playgroud)

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