ローカルに存在しないすべてのファイルを削除するSVNコマンド


134

SVNには、ディレクトリ内でローカルに見つからないファイルをすべて削除するために使用できるコマンドがありますか?

または、失敗した場合、欠落している(または、より一般的なケースでは、ステータスA、D 、?などの)ファイルのみを一覧表示する方法


1
1つの作業フォルダと1つのチェックアウトフォルダを保持しています。そして、ファイルのみを作業フォルダからチェックアウトフォルダに移動します。フォルダーを追加/削除する必要がある場合は、手動で行ってから、そのフォルダーにファイルを移動します(新しいパッケージ、古いパッケージなど)。ほとんどのsvnの問題は、作業コピー上のフォルダーを移動したときに発生します。作業コピーからチェックアウトコピーにファイルをコピーする場合でも、フォルダーではなく、ファイルのみを移動する必要があります。
Siddharth、2012年

回答:


99

TortoiseSVNを使用している場合は、[ 変更をチェック ]を実行し、[ ステータス ]列で並べ替え、マークされているすべてのエントリを選択しmissing、右クリックしてコンテキストメニューを開き、[ 削除]を選択します。最後に、変更をリポジトリに公開することをコミットします。

Windowsを使用しているが、コマンドラインを好み、PowerShellを少し楽しんでいる場合は、この1行で対処できます。

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

つまり、不足しているファイル(行の先頭に感嘆符が付いている)を示す行のみに出力をフィルター処理し、関連するファイル名をキャプチャして、そのファイル名に対してを実行svn rmします。

(ブログの投稿SVN作業コピーからすべての「不足している」ファイルを削除すると、Unix / Linuxでも同様の処理が行われます。)


Eclipseでサブクリッププラグインを使用する方法はありますか?更新してプロジェクトで見つけて再度削除するのはとても悪いことです。
スタン

参考までに、Subversionのパスワードが必要な場合の構文は次のとおりです。svn status --username user_name_here --password password_here | ?{$ _ -match '^!\ s +(。*)'} | %{svn rm $ Matches [1] --username user_name_here--password password_here}
Jeff

実行する前に、この行の後で最初にコミットする必要がありますsvn upか?ファイルはsvnサーバーから復元されるため
Pierre

このアクションにより、リポジトリからファイルも削除されますか?
セバスティアンUlloa

175

Mac(Darwin)またはLinuxを使用している場合は、次のコマンドの出力をパイプして、svn rm不足しているすべてのファイルを見つけることができます。これらを実行する前に、現在の作業ディレクトリを適切なディレクトリまたはサブディレクトリに設定できます-これを作業コピー全体で実行するか、サブセットのみで実行するかによって異なります。

  1. SVNステータスを実行する
  2. 「!」で始まる行を検索します (欠落)
  3. #2からの出力の「--force」(svn引数)と2列目(ファイル名)を出力します
  4. svn rm#3の出力を引数として使用して実行

したがって、完全なコマンドは次のとおりです。

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

参照:


4
ファイル名にスペースが含まれている場合、これは機能しません。しかし、それを修正するのに十分なawkを知りません。
Bugloaf 2013年

2
awk '{print " --force "$2"@"}'ファイル名に@(たとえば、iOS開発者の場合)が含まれている場合に使用します
Guillaume Algis 2013年

1
そして、空白でファイル名を処理awk '{$1=""; print " --force \""substr($0,2)"@\"" }'し、トリックを実行する必要があります(そして醜く見え始めます)
Guillaume Algis '21

12
スペースを処理する完全なコマンドは、「svn st | grep ^!| awk '{$ 1 = ""; print "--force \" "substr($ 0,2)" @ \ ""}' | xargs svn rm "
HelloWorld

1
--forcexargsの部分に入れてみませんか?
jwg 14

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. 不足しているファイルのみをフィルタリングする
  3. 感嘆符を切り取る
  4. 末尾の空白を除外する
  5. 先頭の引用を追加
  6. 末尾の引用を追加
  7. svn remove 各ファイル

このソリューションは、ファイル/ディレクトリにスペースがある場合に機能します。
ユリック2016年

これに冗長性をどのように追加しますか?xargs -verbose svn rm?
TekiusFanatikus

1
スクリプトなどのユーザーのためのちょうどヒント削除へのファイルが見つからない場合は、このコマンドは失敗します。SVN:E205001:E205001::より多くの情報のsvnのための「削除のsvn help」を試して引数が足りません
トルステンSchöning

1
@ThorstenSchöningの問題は-rxargsオプションに追加することで修正できます(引数が指定されていない場合は実行しないでください)。さらに、非常に多数のファイルを削除すると呼び出しが失敗するため、引数の数を制限し、削除をバッチ処理する必要があります -n 500。そして、少なくとも最後のではなく、行っ引用することのようなシェルスペシャル含むファイルのための次善のである$-よりよい利用\n区切り文字としてのとに引用ままxargssvn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

Windows版のPaul Martinに感謝します。

これはスクリプトに若干の変更を加えたもので、スペースのあるWindowsファイルも考慮されます。またmissing.listファイルは最後に削除されます。

以下をSVN binディレクトリ(%% PATH環境で設定)のsvndel.batに保存したので、コマンドプロンプトで任意のフォルダーから呼び出すことができます。

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

革新的なバッチコードがまだ表示されているのを見るのはうれしいです:)
user230910

うわー、素晴らしい答え。私はpowershellを使い始めましたが、これははるかに簡単でした。
ジムアンドラカキス2018年

私は後に別の行を追加してdel missing.list 2>NUL、私はすべての新しいファイルが直接の後の最初の削除されたファイルを削除する追加したので、それは追加して、missing.listsvnのために:svn delete "missing.list"私のために働いた
ピエール・

このスクリプトを変更して任意の場所から実行しようとしたところ、この問題が発生しました。stackoverflow.com/ questions / 1137219 / …このアクションを実行するには、現在の作業ディレクトリを使用する必要があるようです。
aolszowka

7

私はPowerShellオプションが好きです...しかし、Windowsバッチスクリプトを使用している場合の別のオプションを次に示します。

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

パスにスペースが含まれていない削除対象ファイルに対してLinux(bash)で機能する代替:

svn delete `svn status | グレップ!| awk '{print $ 2}' `

4

このシェルスクリプトは、再帰が調べ(svn statusプロジェクト内の)ディレクトリに、(質問の要求など)不足しているファイルを削除し、リポジトリに新しいファイルを追加します。ある種の「プロジェクトの現在のスナップショットをリポジトリに保存する」のです。

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done

4

コマンドラインのわずかな変更。これはMac OS(できればLinuxでも)で機能し、「!M」(欠落して変更された)などのコマンド「svm sr」が報告するファイルに対応します。

ファイル内のスペースに対応します。

それは前の答えの修正に基づいています:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

実際にmissing.listuser3689460とPaul Martin を完全に削除することが可能です。

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

参考までに-これはWindowsランドのDOS / cmd.exeです
user230910

2

多数のファイルを処理する場合、xargsへの引数入力が長くなりすぎる可能性があります。その場合にも機能する、より単純な実装を採用しました。

これはLinux用です。

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

1

改良版

したがって、完全なコマンドは次のとおりです。

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.