46

SVN プロジェクトの作業コピーがあります。ファイルは、アプリケーションによってこの作業コピーから削除されます。SVN コマンドラインを使用して作業コピーをコミットするときに、これらの削除されたファイルをリポジトリから削除したいと考えています。

それを使用して作業コピーをコミットしてsvn commitも、ファイルはプロジェクトから削除されません (ローカルで削除されていないためですsvn delete。SVN に (リポジトリから) 削除するように指示できる方法はありますか?ワーキングコピー?

4

4 に答える 4

82

を使用する

svn status

作業コピーの変更がリストされます。(削除されたファイルは ! で始まります)

次に、次のことができます。

svn delete file_to_del1 file_to_del2 etc

そして最後にコミット

これを自動化するために小さなスニペットを書くこともできます:

svn status | grep '^!' | awk '{print $2}' | xargs svn delete

そして最終的にエイリアスを追加します:

alias svn_precommit="svn status | grep '^!' | awk '{print $2}' | xargs svn delete"

ファイル名で @ / スペースをサポートする必要がある場合は、スクリプトを複雑にする必要があります (ファイル名にこれらの文字を使用するべきではありませんが、他の誰かが決定した場合もあります) - これを .bashrc で直接使用できます。

svn_prepare_del() {
        svn st | grep '^!' | | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn 削除
}
于 2012-06-16T19:21:11.647 に答える
7

あなたの質問は、(作業コピーにないファイルを (リポジトリから) 削除するように SVN に指示できる方法はありますか? ) は、実際には関連する質問svn command to delete all local missing filesの複製です。その質問に答えて、リポジトリから必要なファイルを自動的に識別して削除できるようにする、1 行の PowerShell スクリプトを提供しました。便宜上、ここに再現します。

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

もちろん、これは Windows を使用していることを前提としています。Linux/Unix を使用している場合の類似のソリューションを次に示します。

ただし、質問のパート2を追加すると、うっかり明らかにしてしまいました:-)後のコメントで-コミット時にこれを自動的に行う方法はありますか? --それでは、あなたの質問はユニークです。

パート 2 に答える唯一の方法は、pre-commit hookを使用することです。つまり、コミットの開始時にコミット自体が実際に発生する前に実行されるフック スクリプトです。通常、pre-commit フックを使用して一連の条件を検証し、コミットの続行または終了を許可します。悲しいかな、コミット自体の間にコミットされているファイルのセットを変更することは、望ましいどころか、許されることではないと思います。しかし、この点が文書化されていないので、この点についてさらに掘り下げたいと思うかもしれません.

2012.06.19 ドンのコメントによる明確化

処理する削除済みファイルはクライアント上にあるため、サーバー側のフックではなく、クライアント側のフックが必要であるというドンの意見は正しいです。コマンドライン svn にはこのオプションはありませんが、TortoiseSVN にはクライアント側のフックが用意されています。実際、参照されているマニュアル ページを熟読した後、TortoiseSVN はpre-commitフックを提供するだけでなく、この状況に最適なstart-commitフックも提供することを思い出しました。違いは、コミット ダイアログを開いた、[ OK] を押してコミットを実行しようとしたに、プレコミット フックが実行されることです。一方、start-commit フックは前に実行されます。コミット ダイアログが開きます。したがって、フック スクリプトを配置すると、コミットするファイルのリストが表示されるまでに、削除するファイルも含まれます。

于 2012-06-18T00:34:15.060 に答える