SVN作業ディレクトリがあります。そのディレクトリに変更を加えたところ、に表示されましたsvn status
。しかし、そこにあるすべての変更を削除し、コマンドラインを使用してトランクからすべてを取得する方法はありますか?
SVN作業ディレクトリがあります。そのディレクトリに変更を加えたところ、に表示されましたsvn status
。しかし、そこにあるすべての変更を削除し、コマンドラインを使用してトランクからすべてを取得する方法はありますか?
回答:
私は他の人々の答えを組み合わせてこの解決策を考え出しました:
svn revert -R .
svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf
svn update --force
svn revert -R .
svn cleanup . --remove-unversioned
svn cleanup . --remove-ignored
変更がない場合は、常に徹底的および/または怠惰にして行うことができます...
rm -rf *
svn update
しかし、実際には、nuke-from-spaceオプションが必要なものであることが本当に確実でない限り、それを行わないでください。これには、すべてのビルドクルーフ、一時ファイル、およびSVNが無視するものも含まれるという利点があります。
より正しい解決策は、revertコマンドを使用することです。
svn revert -R .
-Rを指定すると、subversionは再帰し、現在の作業ディレクトリ内およびその下のすべてを元に戻します。
svn nuke-from-space
ここでの答えはどれも、私が望んでいたものとまったく同じではありませんでした。これが私が思いついたものです:
# Recursively revert any locally-changed files
svn revert -R .
# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
tr '\n' '\0' | xargs -0 rm -rf
Linuxでテスト済み。Cygwinで動作する可能性がありますが、xargsを'\0'
空白の代わりに基づいて分割できるようにするGNU固有の拡張機能に依存しています(私は信じています)。
上記のコマンドの利点は、サンドボックスをリセットするためにネットワークアクティビティを必要としないことです。以前とまったく同じものが得られ、すべての変更が失われます。(誰かがこのコードを破壊したことで私を非難する前の免責事項);-)
このスクリプトは、いくつかのテストを実行した後にクリーンビルドが確実に実行されるようにしたい継続的インテグレーションシステムで使用します。
編集:これがSubversionのすべてのバージョンで機能するかどうかはわかりません。svn status
コマンドが常に一貫した形式であるかどうかは明確ではありません。このような包括的なrm
コマンドを使用するコマンドと同様に、自己責任で使用してください。
Windowsを使用している場合、次のforループは、ワークスペースに加えられたすべてのコミットされていない変更を元に戻します。
for /F "tokens=1,*" %%d in ('svn st') do (
svn revert "%%e"
)
コミットされていないすべての変更とバージョン管理されていないオブジェクトをすべて削除する場合は、2つのループが必要です。
for /F "tokens=1,*" %%d in ('svn st') do (
svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
svn rm --force "%%e"
)