Subversionリポジトリの作業コピーがある場合、単一のコマンドまたはツールを使用して、その作業コピー内のバージョン管理されていないファイルまたは無視されたファイルをすべて削除する方法はありますか?基本的に、私はのSVNアナログを探していgit clean
ます。
コマンドラインまたはGUIソリューション(TortoiseSVN用)のいずれかが受け入れられます。
Subversionリポジトリの作業コピーがある場合、単一のコマンドまたはツールを使用して、その作業コピー内のバージョン管理されていないファイルまたは無視されたファイルをすべて削除する方法はありますか?基本的に、私はのSVNアナログを探していgit clean
ます。
コマンドラインまたはGUIソリューション(TortoiseSVN用)のいずれかが受け入れられます。
私はこれが古いことを知っていますが、誰かがそれに遭遇した場合に備えて、svnの新しいバージョン(1.9以降)がサポートされてい--remove-unversioned
ますsvn cleanup . --remove-unversioned
。
https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options
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
TortoiseSVNの使用:
このワンライナーはあなたを助けるかもしれません:
$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf
注意して使用してください!
Powershellを使用してYanal-YvesFargiallaと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に感謝します。
これは他の回答と似ていますが、実際には無視されたファイルを取得します(REの「I」に注意してください)。
rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
誰かがあなたが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ツールを必要としません。:)
Linuxシステムを使用している場合は、SVNコマンドラインだけでそれらを削除することはできません(ただし、GUIツールについてはわかりません)。これは次の場合に役立ちます。
http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/
もう1つの(残忍な)方法は、変更をコミットし、フォルダーからすべてを削除して、再度チェックアウトすることです。