Subversionリポジトリの作業コピーがある場合、単一のコマンドまたはツールを使用して、その作業コピー内のバージョン管理されていないファイルまたは無視されたファイルをすべて削除する方法はありますか?基本的に、私は git clean
に類似したSVNを探しています。
コマンドラインまたはGUIソリューション(TortoiseSVN用)のどちらでもかまいません。
TortoiseSVNの使用:
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done
これには次の機能があります。
--xml
オプションを使用して結果のxml出力を解析する以外にできることはあまりありません)svn status
がファイル名の前に他のステータス文字を出力する場合でも機能します(ファイルが追跡されないためではありませんが、念のため...)次を含むsvnclean
という名前のシェルスクリプトを使用します。
#!/bin/sh
# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1
svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
# tell the user which file is being deleted. use printf
# instead of echo because different implementations of echo do
# different things if the arguments begin with hyphens or
# contain backslashes; the behavior of printf is consistent
printf '%s\n' "Deleting ${f}..."
# if rm -rf can't delete the file, something is wrong so bail
rm -rf "${f}" || exit 1
done
私はこれが古いことを知っていますが、他の誰かがそれにつまずく場合、svnの新しいバージョン(1.9以降)は--remove-unversioned
をサポートします。 svn cleanup . --remove-unversioned
。
https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-cleanup-options
このonelinerはあなたを助けるかもしれません:
$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
注意して使用してください!
Powershellを使用してYanal-Yves Fargiallaとgimpfの回答を変更します(ただし、Stackoverflowによる元の投稿へのコメントは許可されていません)。
powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}
これにより、カラット( "^")が追加されて行の先頭が指定され、文字 "i"を含むすべてのファイルとの一致が回避されます。また、-recurseおよび-forceのフラグをrmに追加して、このコマンドを非対話型にし、スクリプトで使用できるようにします。
SVNの多くのことは、さまざまな方法で行うことができます。これは、ここで示したさまざまなコマンドラインの回答から明らかです。バージョン1.7の登場により、TortoiseSVNにはさらに別の手法があり、実際にはStefanの回答よりもきめ細かい解像度を提供し、バージョンのないファイルを無視されたファイルとは別に選択できます。このダイアログを開くには、TortoiseSvn >> Clean up...
を選択するだけです。
Powershellの場合:
(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm
コマンドラインから:
powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
このワンライナーは私のために機能します(リチャード・ハンセンの答えに基づいて、驚くほどスペースを含むファイルでは機能しませんでした):
svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
TortoiseSVNの使用:
本当にきれいできれいなソリューションではありませんが、私が知っている最速の方法です(Windowsの場合)。
無視されたファイルのヒントを提供してくれたpkhに感謝します。
誰かがあなたがWindowsコマンドラインからそれをすることができないと言いました。
ブル。
for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")
1行で実行し、単一のGNUツールを必要としません。 :)
これは他の回答と似ていますが、実際には無視されたファイルを取得します(REの「I」に注意してください):
rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
あなたがLinuxシステムの下にいる場合、SVNコマンドラインだけでそれらを削除することはできません(GUIツールについてはわかりません)
http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/
もう1つの(残忍な)方法は、変更をコミットし、フォルダーからすべてを削除して、もう一度チェックアウトすることです。