web-dev-qa-db-ja.com

不要なsvn:mergeinfoプロパティを削除

リポジトリにあるものをマージするとき、Subversionは、マージしたいものとはまったく関係のないファイルに多くのsvn:mergeinfoプロパティを追加/変更したいと考えています。

この動作に関する質問は、ここまでスタックオーバーフローについて質問されています。

上記のトピックから理解したことから、リポジトリ内の多くのファイルには、明示的にsvn:mergeinfoプロパティがあるはずですが、そうすべきではありません。アドバイスは、量を減らし、それらのプロパティを関連するファイル/フォルダにのみ配置することです。

さて、私の質問:不要なプロパティを簡単に削除するにはどうすればよいですか? TortoiseSVNを使用していますが、何百ものファイルを手動でチェック/修正することに消極的です。これらの不要なsvn:mergeinfoプロパティを削除する簡単な方法はありますか?

追伸私はC++ SVN APIコードを探していますnot

136
LeonZandman

ルートフォルダーではなく、すべてのサブツリーsvn:mergeinfoプロパティを削除する別の方法を次に示します(これは、ブランチが適切に機能するために必要です)。

プロジェクトのルートから:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
139
Vincent

すべてのサブツリーsvn:mergeinfoプロパティを削除する方法を次に示します。リポジトリのルート内で実行します。

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

簡単にコピー/貼り付けできるように、すべて1行で:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

実行する前にこれがどのファイルに影響するかをプレビューするには、最後の「propdel」を「propget」に変更するか、最後のxargsパイプを完全に削除します。

15
Kelvin

このスレッド で述べたように:

  • ほとんどの空のmergeinfo(「空白」)は、ソースアイテムに明示的なmergeinfoがない作業コピーから作業コピーへのコピー/移動によって発生する可能性があります。 1.6 SVNを使用している場合を除き、propdelを使用すると解決できます。1.5.5以降、これらのWC-to-WCコピーは宛先に空のmergeinfoを作成しなくなりました
  • 以前のsvn move(rename)再構築操作でも、ルートディレクトリに残すのではなく、mergeinfoを伝播できます。
  • case 339 によって追跡される潜在的なメモリの問題があります。これは次の1.6.2バージョンで修正され、1.5でバックポートされます
12
VonC

私は盲目の自信がないのでsvn:merge-infoプロパティの削除。作業コピーの現在の状況を分析し、ルート以外のmerge-infoプロパティから可能な限り多くのマージリビジョンを削除するツールを実装しました。追加の人間のチェックと制御の後、作業コピーの変更をコミットできます。

ここにあります: svn-clean-mergeinfo

それを改善するためにその使用に関する問題を報告することをheしないでください。

Subversion 1.10では、そのタスク専用の新しいツールsvn-mergeinfo-normalizer

6
Yves Martin

私はそれがしばらくしていたことを知っていますが、私は同様の問題に遭遇しました。 TortoiseSVN 1.6.7を使用しています。ちょうどそのプロパティが作業コピーのルートにあることがたまたま起こりました。ルートのプロパティを表示してsvn:mergeinfoの[削除]をクリックすると、再帰的に削除するかどうかを尋ねられました。これにより、svn:mergeinfoのすべてのコックアップが削除されました。

4
HackedByChinese

Mergeinfoプロパティを盲目的に削除するだけでなく、「欠落した」マージを完了することもできます。

ルートフォルダーからmergeinfoプロパティをコピーし、適切な相対パスとまったく同じリビジョンリストの子フォルダーでマージを実行します。 (必須ではありませんが、このリストと既に子フォルダーにあるリストとの違いのみをリストすることができます。)

通常、このマージでは、実際のファイルではなく、mergeinfoプロパティのみが変更されます。 (最終的にファイルを変更する場合は、以前のマージの1つが部分的なマージであったに違いないため、とにかく問題が発生した可能性があります。)

これを行うと、両方が完全に一致するようになったら、mergeinfoプロパティを削除することになります。また、逆を行う必要があるかもしれません:子フォルダーにのみ存在するマージリビジョンをルートにマージします(ここでも、完全なリストを貼り付けてSVNに違いを見つけさせることができます)。

2
Miral

Mergeinfoプロパティを一括削除したい場合は、次のBASHスクリプトを使用できます。

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

変更されたファイルのリストを取得し、変更をmergeinfoのみにフィルターし、実際のファイルパス以外のすべてを削除し、1行に1つのパスをスペース区切りリストに変換し、そのリストで呼び出しを元に戻します。

2
Chase Seibert

ディレクトリ構造を変更するには、次のようにします(DOS以外の「検索」のみ)。

find . -path "*/.svn" -Prune -or -exec svn propdel svn:mergeinfo '{}' \;

1.5サーバーに接続された1.6.12クライアントを実行すると、同様の問題が発生します。そこにis独自のsvn:mergeinfoを必要とするプロジェクト内のサブディレクトリがありますが、121個のエントリ(./varの下に "svn:ignore *"を含む5つのディレクトリを含む)があります。したがって、明らかに余分なマージ情報を削除して他の違いを伝えることができる(たとえばPython)スクリプトを持っているといいでしょう...

1
Tobias