SVNには、ディレクトリ内でローカルに見つからないファイルをすべて削除するために使用できるコマンドがありますか?
または、失敗した場合、欠落している(または、より一般的なケースでは、ステータスA、D 、?などの)ファイルのみを一覧表示する方法
SVNには、ディレクトリ内でローカルに見つからないファイルをすべて削除するために使用できるコマンドがありますか?
または、失敗した場合、欠落している(または、より一般的なケースでは、ステータスA、D 、?などの)ファイルのみを一覧表示する方法
回答:
TortoiseSVNを使用している場合は、[ 変更をチェック ]を実行し、[ ステータス ]列で並べ替え、マークされているすべてのエントリを選択しmissing
、右クリックしてコンテキストメニューを開き、[ 削除]を選択します。最後に、変更をリポジトリに公開することをコミットします。
Windowsを使用しているが、コマンドラインを好み、PowerShellを少し楽しんでいる場合は、この1行で対処できます。
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
つまり、不足しているファイル(行の先頭に感嘆符が付いている)を示す行のみに出力をフィルター処理し、関連するファイル名をキャプチャして、そのファイル名に対してを実行svn rm
します。
(ブログの投稿SVN作業コピーからすべての「不足している」ファイルを削除すると、Unix / Linuxでも同様の処理が行われます。)
svn up
か?ファイルはsvnサーバーから復元されるため
Mac(Darwin)またはLinuxを使用している場合は、次のコマンドの出力をパイプして、svn rm
不足しているすべてのファイルを見つけることができます。これらを実行する前に、現在の作業ディレクトリを適切なディレクトリまたはサブディレクトリに設定できます-これを作業コピー全体で実行するか、サブセットのみで実行するかによって異なります。
svn rm
#3の出力を引数として使用して実行したがって、完全なコマンドは次のとおりです。
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
参照:
awk '{print " --force "$2"@"}'
ファイル名に@
(たとえば、iOS開発者の場合)が含まれている場合に使用します
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
し、トリックを実行する必要があります(そして醜く見え始めます)
--force
xargsの部分に入れてみませんか?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
各ファイル-r
、xargs
オプションに追加することで修正できます(引数が指定されていない場合は実行しないでください)。さらに、非常に多数のファイルを削除すると呼び出しが失敗するため、引数の数を制限し、削除をバッチ処理する必要があります -n 500
。そして、少なくとも最後のではなく、行っ引用することのようなシェルスペシャル含むファイルのための次善のである$
-よりよい利用\n
区切り文字としてのとに引用ままxargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
私はこれを見つけました、それはトリックを行います、SVN作業コピーからすべての「失われた」ファイルを削除します:
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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
del missing.list 2>NUL
、私はすべての新しいファイルが直接の後の最初の削除されたファイルを削除する追加したので、それは追加して、missing.list
svnのために:svn delete "missing.list"
私のために働いた
このシェルスクリプトは、再帰が調べ(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
実際にmissing.list
user3689460とPaul Martin を完全に削除することが可能です。
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
多数のファイルを処理する場合、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