SVN CLIを使用して作業効率を向上させるには?次の繰り返し操作を完了する必要があります。
- ディレクトリで変更されたファイルを探す
- その一部のみを提出
- 何らかの方法で選択して名前を覚えてください。
- バージョン指定されていないファイルのリスト
- 機能するものを使っていくつか追加し、覚えておいてください。
- 特定のディレクトリの一部のファイルのみを回復
私はWindows上でTortoiseSVNに精通していますが、OSX(Linuxと非常によく似ています)に切り替えると、他のクライアントが不便または非常に高価なので、SVNのCLIを使用する必要があります。
答え1
同様の問題が発生しました。私のアプローチは、私が実行する最も一般的な操作のためのシェルエイリアスまたは関数を書くことです。ちなみに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 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
}
このコードを見ると、私はこのコードを数年前にバージョンコントロールを使い始めたときに書いたことがわかります。
答え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に拘束されないエイリアスに移動しています。これは10年ほど使用してきたCVSショートカットに似たsvn関連ショートカットです)。
## 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
。