作業コピーをリセットするSubversionコマンドはありますか?


110

リポジトリに保存されている状態に作業コピーを「リセット」する単一のSubversionコマンドはありますか?以下のようなものgit reset --hardか(ヘクタール、ハードGitのリセットは、いずれかのバージョン管理外のファイルを削除しません!) rm -rf wc && svn co <url> wc

更新:作業コピー内の余分なファイルが削除されないため、単純な復帰の後ではありません。作業コピーを削除して再度チェックアウトするのと同じことを本当に望んでいます。データを再度ダウンロードする必要はありません。(明らかに、コミットされていないすべての変更が失われてもかまいません。)


作業コピーのすべての変更を元に戻しますか?
モーリス

5
git clean -xdfソース管理下にないものを削除するために使用します。
vcsjones 2011年

1
@vcsjones:ありがとう、git clean私が探しているものを正確に引用しているmanページ:「これを使用して(おそらくgit resetと組み合わせて)、クリーンなビルドをテストするための初期の作業ディレクトリを作成できます。」Subversionにはこのような機能が組み込まれていないようです。
zoul

回答:


180

次のように再帰的に戻すことができます:

svn revert --recursive .

ソース管理下にないものを削除する方法は(クリエイティブスクリプトを書かずに)ありません。私ができる最も近いことは、すべてのファイルを反復処理し、を使用しての結果をsvn listgrepし、grepが失敗した場合はそれを削除することです。

編集:クリエイティブスクリプトの解決策は次のとおりです:Subversionのバージョン管理されていないファイルを自動的に削除します

したがってrevert、リンクされた質問の回答と自分に最も適したものを組み合わせたスクリプトを作成できます。


3
svn cleanup最初にwcで実行することもできます。これは、マージの中止後にクリーンアップするための私の標準的な方法です。
Mike Miller

亀には、クリーンアップダイアログに「バージョン管理されていないファイルを削除する」というオプションもあります。
v.oddou 2013

2
コマンドラインから「バージョン管理外のファイルを削除」が利用できると便利です。特に自動ビルド用。
C.テワルト

3
私の回答を参照してください... --remove-unversionedはsvn cleanupのために存在します
Denny Weinberg

38

追跡されたファイルを元に戻すには

svn revert . -R

追跡されていないファイルをクリーニングするには

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rf/最初は怖いが、一度それはこれらの理由のためではありません理解しなければならないことがあります。

  1. 完全に追跡されていないディレクトリのみが、渡されたパターンに一致します rm
  2. -rfこれらのディレクトリは削除されません他に、必要とされます

元に戻して消去するには(OPの質問)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

一貫した使いやすさのために

.bash_aliasesに永続的なエイリアスを追加します

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

2番目のスニペットは私には機能しないようです:awk: fatal: error reading input file '-': Input/output error
hbogert

コマンドでをエスケープする必要があり?ましたがawk、それ以外の場合、出力のすべての行に一致しましたsvn status
gpanders

23

次のコマンドを使用して、ローカルコピー内のすべてを削除します。

rm -r your_local_svn_dir_path/*

そして、以下のコマンドを使用してすべてを再帰的に元に戻します。

svn revert -R your_local_svn_dir_path

ローカルのSVNメタデータからファイルが復元されているため、ディレクトリ全体を削除してから新たにチェックアウトするよりも、この方法の方が高速です。ネットワーク接続も必要ありません。


4
svn cleanup --remove-unversionedの方がはるかに高速です。
Znik

7
svn revert . -R

すべてをリセットします。

svn revert path/to/file

単一ファイル


1
作業コピーのバージョン管理されていない余分なファイルは削除されませんか?
zoul

@zoul私はそうは思いませんが、SVNを使用してからしばらく経っていますので、そのことを私に引用しないでください
Abe Voelker

残念ながら、追跡されていないファイルには触れません。svn revert -R your_local_svn_dir_pathを試してください
Znik

7

バージョン管理されていないファイルを削除し、変更を元に戻します。

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

でる:

D         D:\tmp\sql\update\abc.txt

1
これは、追加のスクリプトなしの最良の答えです。これは普遍的で、多くのsvnバージョンと互換性があります。
Znikの

3

純粋なWindows cmd / batソリューション:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

OSから作業コピーを削除して再度チェックアウトするのが最も簡単ですが、単一のコマンドではありません。


痛いほど遅い。だから私はこれを回避する方法を探していました。
zoul

1
+1、これが奇妙な問題を修正する唯一の方法であることがよくあります。少なくとも私が見つけた方法です。
ブラッド

2

非常に迅速かつシンプルで、まさにあなたが望むものを行います

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/は私自身の目的のためです。

そして、svnコマンドに--no-ignoreを追加することをお勧めします


2
これはひどいです。Windowsユーザーはどうですか?Subversionは、バージョン管理ツールとして真剣に受け止められる前に、明らかに少し作業が必要です。
Warren P

1

追跡されていないファイルを削除するには

私はsvn stbashで報告されたすべての追跡されていないファイルをリストすることができました:

echo $(svn st | grep -P "^\?" | cut -c 9-)

運が良ければ、に置き換えechorm、追跡されていないファイルを削除できます。または、運が悪い場合は、手動で削除するファイルをコピーします。


(私は@ abe-voelkerの回答を使用して残りのファイルを元に戻しました:https ://stackoverflow.com/a/6204601/1695680 )

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.