リポジトリにあるものをマージするとき、Subversionは、マージしたいものとはまったく関係のないファイルに多くのsvn:mergeinfo
プロパティを追加/変更したいと考えています。
この動作に関する質問は、ここまでスタックオーバーフローについて質問されています。
上記のトピックから理解したことから、リポジトリ内の多くのファイルには、明示的にsvn:mergeinfo
プロパティがあるはずですが、そうすべきではありません。アドバイスは、量を減らし、それらのプロパティを関連するファイル/フォルダにのみ配置することです。
さて、私の質問:不要なプロパティを簡単に削除するにはどうすればよいですか? TortoiseSVNを使用していますが、何百ものファイルを手動でチェック/修正することに消極的です。これらの不要なsvn:mergeinfo
プロパティを削除する簡単な方法はありますか?
追伸私はC++ SVN APIコードを探していますnot。
ルートフォルダーではなく、すべてのサブツリーsvn:mergeinfoプロパティを削除する別の方法を次に示します(これは、ブランチが適切に機能するために必要です)。
プロジェクトのルートから:
svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
すべてのサブツリー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パイプを完全に削除します。
このスレッド で述べたように:
私は盲目の自信がないのでsvn:merge-info
プロパティの削除。作業コピーの現在の状況を分析し、ルート以外のmerge-infoプロパティから可能な限り多くのマージリビジョンを削除するツールを実装しました。追加の人間のチェックと制御の後、作業コピーの変更をコミットできます。
ここにあります: svn-clean-mergeinfo
それを改善するためにその使用に関する問題を報告することをheしないでください。
Subversion 1.10では、そのタスク専用の新しいツールsvn-mergeinfo-normalizer
私はそれがしばらくしていたことを知っていますが、私は同様の問題に遭遇しました。 TortoiseSVN 1.6.7を使用しています。ちょうどそのプロパティが作業コピーのルートにあることがたまたま起こりました。ルートのプロパティを表示してsvn:mergeinfoの[削除]をクリックすると、再帰的に削除するかどうかを尋ねられました。これにより、svn:mergeinfoのすべてのコックアップが削除されました。
Mergeinfoプロパティを盲目的に削除するだけでなく、「欠落した」マージを完了することもできます。
ルートフォルダーからmergeinfoプロパティをコピーし、適切な相対パスとまったく同じリビジョンリストの子フォルダーでマージを実行します。 (必須ではありませんが、このリストと既に子フォルダーにあるリストとの違いのみをリストすることができます。)
通常、このマージでは、実際のファイルではなく、mergeinfoプロパティのみが変更されます。 (最終的にファイルを変更する場合は、以前のマージの1つが部分的なマージであったに違いないため、とにかく問題が発生した可能性があります。)
これを行うと、両方が完全に一致するようになったら、mergeinfoプロパティを削除することになります。また、逆を行う必要があるかもしれません:子フォルダーにのみ存在するマージリビジョンをルートにマージします(ここでも、完全なリストを貼り付けてSVNに違いを見つけさせることができます)。
Mergeinfoプロパティを一括削除したい場合は、次のBASHスクリプトを使用できます。
FILES=`svn status |grep "^ M " |sed s/" M "// |tr '\n', ' '`
svn revert $FILES
変更されたファイルのリストを取得し、変更をmergeinfoのみにフィルターし、実際のファイルパス以外のすべてを削除し、1行に1つのパスをスペース区切りリストに変換し、そのリストで呼び出しを元に戻します。
ディレクトリ構造を変更するには、次のようにします(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)スクリプトを持っているといいでしょう...