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


136

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

この動作に関する質問は、Stack Overflowの前にここで尋ねられました。

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

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

PS私はC ++ SVN APIコードを探していません

回答:


142

すべてのサブツリーのsvn:mergeinfoプロパティを削除する別の方法は次のとおりです(ルートフォルダーでは削除されません)(ブランチが正しく機能するために必要です)。

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

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

57
または、ルートディレクトリ "svn propdel -R svn:mergeinfo ./*"では実行しないでください
JeremyWeir

3
"svn propdel -R svn:mergeinfo ./* ./.[^.]*" "dot" / * ix隠しファイルもある場合、Windowsユーザーにとっては問題にならないでしょう。
Peter

3
出力を抑制するとスピードアップします: "svn propdel svn:mergeinfo -R> nul"(または> / dev / null using Linux)
bebbo

2
@JeremyWeir「ルートディレクトリでは実行しないでください」とはどういう意味ですか?それからどこから?あなたはそのコメントについて多くの賛成票を持っていますが、私は代替案を見ていません。
TT。

3
@TT。アイデアは、すべてのめちゃくちゃになったマージ情報があるディレクトリに移動してそこから実行することなので、ルートディレクトリを元に戻す必要はありません。ルートのmergeinfoをいじりたくはありません。
JeremyWeir

15

これは、すべてのサブツリーの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パイプを完全に削除します。


2
ファイル内のハイフンで動作します:svn propget -R svn:mergeinfo | grep -v "^ /" | grep -v "^ \。" | 「-d」をカット-f1 | xargs svn propdel svn:mergeinfo
リス

12

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

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

6

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

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

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

Subversion 1.10では、そのタスク専用の新しいツールが導入されています。 svn-mergeinfo-normalizer


2
このツールは、大規模なチームで完全に連携していない開発者が作成する可能性がある部分的なサブディレクトリのマージで作成される種類など、merge-infoプロパティを統合するのに最適です。ツールにはすべてのブランチに存在しないファイルに関する問題があるようです。ファイルに残ったmerge-infoプロパティを取得して、ファイルが存在しなかったブランチのリビジョンを示します。
davenpcj 2015

私はそれが完璧ではないことに同意します...それが「人間によるチェックと管理」が依然として必要とされる理由です あなたの場合、merge-infoプロパティで関連性のないリビジョンを特定した場合、コミットする前に、それらのリビジョンまたはそのファイルのsvn:merge-infoプロパティ全体を削除できます。改善を依頼するにはgithubを使用してください。
イヴマーティン

4

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


私も同じ状況でした。私のために働いた。ありがとう!
andrewd18

2

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

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

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


2
ありがとうございますが、私がTortoiseSVNについて言及していることを知っているかもしれませんが、私はWindowsユーザーであり、Bashシェルを使用しません:-)
LeonZandman

DOSでも同じことが可能ですが、それほど簡潔ではありません。
Chase Seibert

1
これは、現在の作業ディレクトリで変更されたmergeinfoを持つファイルのみを元に戻しませんか?その場合、問題は解決されません。既存の明示的なmergeinfoです。そのためには、propdelする必要があります。
Dominic Sc​​heirlinck、2009

2
これはかなりバグがあります-名前に空白を含むファイル名がありますか?名前にグロブ文字が含まれていますか?どちらの場合も悪いニュース。svn statusからの出力を解析するための承認済み/サポートされている方法は、--xmlフラグとXMLパーサーを使用することです。テキスト出力形式での上位互換性は保証されていないため、他のものはバージョン間で変更される可能性があります。
Charles Duffy

2

mergeinfoプロパティを盲目的に削除するのではなく、「失われた」マージを完了することも可能です。

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

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

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


1

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

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

1.5サーバーに接続された1.6.12クライアントを実行していますが、同様の問題があります。そこにある、独自のsvn必要があり、プロジェクトのサブディレクトリ:mergeinfoは、しかし、(「SVN:無視*」で./var以下の5つのディレクトリを含む)121個の、このようなエントリを持つことは、やや不適切と思われます。したがって、明らかに余分なマージ情報を削除し、他の違いを伝えることができる(Pythonなどの)スクリプトがあると便利です...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.