如何使用 SVN CLI 提高工作效率?我需要完成这样的重复性任务:
- 在目录中查找修改过的文件
- 只提交其中的一些
- 以某种方式选择他们,然后记住他们的名字
- 列出未版本控制的文件
- 仅使用一些有效的方式添加一些,然后记住它们
- 仅恢复特定目录中的部分文件
我习惯了 Windows 上的 TortoiseSVN,但是切换到 OSX(非常类似于 Linux)迫使我使用 SVN 的 CLI,因为其他客户端很糟糕或非常昂贵。
答案1
我遇到了类似的问题。我的方法是为我执行的最常见操作编写 shell 别名或函数。作为参考,这些是 ZSH shell 函数。这些函数本身也应该在 bash 中工作,但 shell 完成的内容会有所不同。
在查看您的使用情况时,您想要执行的“选择某些”操作与我的使用情况不同,并且没有任何规定。实际上,我建议您修改修订控制的使用,以进行更频繁的提交,并利用存储库中的多个工作副本或分支来跟踪选择性更改集。如果您在目录中工作,那么您在那里所做的一切都应该选择性地提交或恢复,但不应留下太多内容。在任何给定时刻提交您所拥有的内容,并使用版本控制功能来处理产品中的内容或不包含的内容。
为了使其工作,您可以将代码放入您的~/.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 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 status
或svn commit <TAB>
- 只提交其中的一些 →
svn commit <TAB>
- 列出未版本控制的文件 →
svn status
或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'
您可能希望在提示中包含一些版本控制信息,例如 zsh 的vcsinfo
。