146

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

コマンドラインまたはGUIソリューション(TortoiseSVN用)のいずれかが受け入れられます。

4

12 に答える 12

145

私はこれが古いことを知っていますが、誰かがそれに遭遇した場合に備えて、svnの新しいバージョン(1.9以降)がサポートされてい--remove-unversionedますsvn cleanup . --remove-unversioned

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

于 2015-08-19T17:59:14.733 に答える
143
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
于 2012-02-04T22:03:59.347 に答える
102

TortoiseSVNの使用:

  • Shiftキーを押しながら、作業コピーフォルダを右クリックします
  • 「バージョン管理されていないアイテムを削除する」を選択します
于 2010-05-11T13:57:34.337 に答える
43

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

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

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

于 2010-05-10T15:21:57.727 に答える
15

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

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

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

于 2012-09-12T04:27:04.713 に答える
8

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

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

于 2012-06-11T16:47:13.517 に答える
8

PowerShellを使用する場合:

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

コマンドラインから:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
于 2012-07-04T22:02:03.187 に答える
6

このワンライナーは私のために機能します(リチャード・ハンセンの答えに基づいていますが、驚くべきことにスペースを含むファイルでは機能しませんでした):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
于 2012-07-11T09:09:10.493 に答える
5

TortoiseSVNの使用:

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

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

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

于 2010-05-10T15:29:37.783 に答える
4

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

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
于 2010-05-10T15:26:59.110 に答える
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ツールを必要としません。:)

于 2014-10-17T15:03:18.540 に答える
1

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

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

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

于 2010-05-10T15:23:16.233 に答える