web-dev-qa-db-ja.com

作業コピーのバージョン管理されていない/無視されたファイル/フォルダーをすべて削除するにはどうすればよいですか?

Subversionリポジトリの作業コピーがある場合、単一のコマンドまたはツールを使用して、その作業コピー内のバージョン管理されていないファイルまたは無視されたファイルをすべて削除する方法はありますか?基本的に、私は git clean に類似したSVNを探しています。

コマンドラインまたはGUIソリューション(TortoiseSVN用)のどちらでもかまいません。

130
Nick Meyer

TortoiseSVNの使用:

  • 作業コピーフォルダーを右クリックします Shiftキーを押しながら
  • 「バージョン管理外のアイテムを削除」を選択します
96
Stefan
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

これには次の機能があります。

  • 無視されたファイルと追跡されていないファイルの両方が削除されます
  • ファイル名に空白が含まれている場合でも機能します(改行を除くが、--xmlオプションを使用して結果のxml出力を解析する以外にできることはあまりありません)
  • svn statusがファイル名の前に他のステータス文字を出力する場合でも機能します(ファイルが追跡されないためではありませんが、念のため...)
  • POSIX準拠のシステムで動作するはずです

次を含む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
129
Richard Hansen

私はこれが古いことを知っていますが、他の誰かがそれにつまずく場合、svnの新しいバージョン(1.9以降)は--remove-unversionedをサポートします。 svn cleanup . --remove-unversioned

https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-cleanup-options

104
Neil

このonelinerはあなたを助けるかもしれません:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

注意して使用してください!

40
jkramer

Powershellを使用してYanal-Yves Fargiallaとgimpfの回答を変更します(ただし、Stackoverflowによる元の投稿へのコメントは許可されていません)。

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

これにより、カラット( "^")が追加されて行の先頭が指定され、文字 "i"を含むすべてのファイルとの一致が回避されます。また、-recurseおよび-forceのフラグをrmに追加して、このコマンドを非対話型にし、スクリプトで使用できるようにします。

14
gwilk

SVNの多くのことは、さまざまな方法で行うことができます。これは、ここで示したさまざまなコマンドラインの回答から明らかです。バージョン1.7の登場により、TortoiseSVNにはさらに別の手法があり、実際にはStefanの回答よりもきめ細かい解像度を提供し、バージョンのないファイルを無視されたファイルとは別に選択できます。このダイアログを開くには、TortoiseSvn >> Clean up...を選択するだけです。

TortoiseSVN cleanup options

7
Michael Sorens

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 {}
6

TortoiseSVNの使用:

  1. 作業コピーのルートを右クリックして、TortoiseSVN-> "変更の確認"を選択します
  2. 「無視されたファイルを表示」を選択します
  3. 「テキストステータス」列で並べ替え
  4. 「バージョン管理されていない」ファイルまでスクロールし、すべてがグループ化されました。それらをすべて選択し、右クリック->削除
  5. 「無視された」ファイルまでスクロールし、すべてがグループ化されました。それらをすべて選択し、右クリック->削除

本当にきれいできれいなソリューションではありませんが、私が知っている最速の方法です(Windowsの場合)。

無視されたファイルのヒントを提供してくれたpkhに感謝します。

5
Thomas Lötzer

誰かがあなたが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ツールを必要としません。 :)

4
ChokesMcGee

これは他の回答と似ていますが、実際には無視されたファイルを取得します(REの「I」に注意してください):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
4
pkh

あなたがLinuxシステムの下にいる場合、SVNコマンドラインだけでそれらを削除することはできません(GUIツールについてはわかりません)

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

もう1つの(残忍な)方法は、変更をコミットし、フォルダーからすべてを削除して、もう一度チェックアウトすることです。

1
Juriy