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


136

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

コマンドラインまたはGUIソリューション(TortoiseSVNの場合)のどちらでも使用できます。


回答:


98

TortoiseSVNの使用:

  • Shiftキーを押しながら作業コピーフォルダーを右クリック
  • 「バージョン管理されていないアイテムを削除」を選択します

7
素敵な機能!ただし、リンクを読んで、XPのリストビュー(ツリービューではない)でのみ機能することを確認する必要がありました。おそらく、それを回答に含める必要があります。
Nick Meyer

5
コマンドラインバージョンのsvn(特にWindowsの場合)は同じ機能を提供しませんか?
blong

3
sombodyが下で指摘したように:svn cleanup --remove-unversioned --remove-ignored .
haui

133
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

2
まさに私が探していたものは、LinuxとMacOSでも魅力のように動作します!
リッチ

IFSをリセットする必要がありますか?「svnclean」スクリプトを作成しないことにしました。それで、スクリプトの残りの部分でIFSが
台無しに

3
@matrixugly:いいえ、IFS前の状態に戻す必要はありません。を実行するとVARNAME=value command、への割り当てはの実行中valueVARNAMEのみ適用されますcommand(には適用されないいくつかの例外がありますread)。詳細については、POSIX仕様このPOSIXバグレポートを参照してください。
Richard Hansen 14

@rich、これを共有してくれてありがとう。数年前にsvnクリーンアップソリューションを探しに来て、シェルスクリプトの知識も持ってきました!明らかに、私はかなりこの回答に戻ってきました。
C.テワルト16

120

私はこれが古いことを知っていますが、誰かがそれにつまずいた場合に備えて、新しいバージョン(1.9以降)のsvn support --remove-unversionedを使用しsvn cleanup . --remove-unversionedます。

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
私にとって、これは正しい答えです。それはクロスプラットフォームのコマンドラインの答えです。また、無視したファイルを削除することもできますsvn cleanup . --remove-ignored
Dan Atkinson

1
SVN 1.6以降で動作します。
ウェグリー

2
1.9に、も参照してくださいことを変更subversion.apache.org/docs/release-notes/1.9.html(私はローカルで試したし、それが機能しなかった、と私は1.8.8によ)
ikku100

2
問題は、バージョン管理されていないフォルダを削除しないことです。
Nyerguds

1
@Nyerguds:True、これにより、バージョン管理されていないフォルダは削除されず、バージョン管理されていないファイルのみが削除されます。誰かが解決策を見つけましたか?
dhiraj suvarna 16

42

このワンライナーはあなたを助けるかもしれません:

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

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


13
これにより、無視されたファイルは削除されず、ファイル名に空白が含まれていると壊れます
Richard Hansen

1
また、無視されたファイルは削除しません
plaisthos 2013年

4
svn status --no-ignore無視されたファイルをうまくキャプチャするために使用できます。
2013

3
実際、オプションとして、無視されたファイルをそのまま残す機能と考えています。
macetw 2014年

15

Powershellを使用してYanal-Yves Fargiallaとgimpfの回答を変更する(ただし、Stackoverflowによって元の投稿にコメントすることはできません):

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

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


コマンドには、最後に追加の二重引用符が必要です。追加するだけですが、編集は明らかに少なくとも6文字でなければなりません。
Ian Miller

7

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

TortoiseSVNクリーンアップオプション


7

PowerShellを使用:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

コマンドラインから:

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

3
この純粋なWindowsスクリプトが大好きです!-match '[\?i]' -replace '^.{8}'代わりに使用することをお勧めします。これは、ファイル名空白で始まっていても正しく機能し、無視されたファイルも削除します。
gimpf 2012

1
gimpfが提案する調整を使用するとうまくいきますが、ItemNotFoundExceptionが発生する場合がありました。結局、svn status結果セットには単一のファイルしかありませんでした。この調整により、この問題が修正されます。code@(svn status --no-ignore)-match '[\?i]' -replace '^。{8}' | rm `。この投稿の
dirtybird '11 / 09/13

1
また、(再帰が指定されていないため)svnにないディレクトリを求めるプロンプトが表示されるため、スクリプトでの使用は適切ではありません。使用:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber 2014年

6

このonelinerは私にとっては機能します(Richard Hansenの回答に基づいていますが、これは意外にもスペースを含むファイルには機能しませんでした)。

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
バージョン管理外のフォルダも削除するには-frrm次のコマンドを追加します:svn status --no-ignore | grep '^ [I?]' | カット-c 9- | xargs -d "\ n" -I {} rm
-fr

5

TortoiseSVNの使用:

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

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

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


これにより、バージョン管理されていないファイルのみが削除されると思います。無視されたアイテムは影響を受けません。
Dirk Vollmar

2
コミットダイアログを使用する必要はなく、無視されたファイルを取得できます。TortoiseSVN | 変更を確認します。次に、「無視されたファイルを表示」をクリックして、適切にソート/削除できます。

4

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

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

1
これは、ファイル名に空白が含まれていると壊れます
Richard Hansen

4

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ツールを必要としません。:)


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")
Darien Pardinas 2015年

@DarienPardinas私はちょうど学んだジェンキンス「を実行し、Windowsのバッチコマンド」、に差し込む場合は、お使いのバージョンでは特に有効であるためにそのための必要性、プロンプトが表示されるが、より多くのバッチスクリプトのようなコマンドではありません%%オーバー%
jxramos

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