2012-03-13 13 views
1

私は自分のワークフロー(通常はsvn diff、時には手作業によるパッチの編集)をマージしてから、patchを実際のsvn mergeと置き換えようとしています。しかし、私は予期しない動作を見ているし、私はSVNのドキュメントのいずれかの説明をオンラインで見つけることができません。 svn diff + patchはなぜこのシナリオでsvn merge --ignore-ancestryが2回動作しないのですか?

    1. 新しいリポジトリ/支社(REV 1。)支店へ
    2. コピーされたトランクトランク内fileと呼ばれる空のファイルに作成
    3. (0 REV。):ここに私のシナリオです(REVを2。) (REV 3)バックトランクに支店/支社では、 "ABCDEFG" とコミットを読むためにfileを変更
    4. 、走っ:

    を210

    これまでのところ、とても良いです。トランク内のfileには「abcdefg」が含まれています。私は--ignore-ancestryを使っていたので、trunkはmergeinfoで更新されませんでした。確認するには、私が実行します。何も出力しない

    svn pg svn:mergeinfo .

    を。すばらしいです。今度はr3の変更をにもう一度に適用したいと思います。だから私は実行します。

    svn merge -c3 ^/branches/branch1 . --ignore-ancestry

    このコマンドは何もしません。出力を出力せず、fileを変更せず、mergeinfoも追加しません。私はこのように、私の古い差分-とパッチのワークフローと同じことを行う場合は、次の

    svn diff -c3 ^/branches/branch1 | patch

    次に、ファイルを再び変更で更新されます。変更はちょうどに達したので:それを再度適用

    --- file (revision 2) 
        +++ file (revision 3) 
        @@ -0,0 +1 @@ 
        +abcdefg 
    

    だけで意図したとおりにfileは、「ABCDEFG」の2つの行が含まれています。

    ~~~

    私は、これは一般的なワークフローではありません知っているが、私は快適にそれを採用することができます前に、svn mergeは、実際にこのような状況でやっていることを理解する必要があるような気がします。 (私はすでにsvn mergeの利益を宣言する必要はありません - 私はすでに乗っています)

    ありがとう!

  • +0

    私はこれがdiff3とdiffの違いと関係していると思っていましたが、diff3を使っても、私はsvn mergeを使って得た結果と同じ結果に終わることはできません。何がありますか? – mhjacobson

    答えて

    1

    マージする2つのファイルを比較して差異を調整します(祖先を使用するときは、ファイルが関連していると何度も簡単になります)。ファイルが同一であれば何も起こりません。 Subversionは、「古いファイル」と「後継ファイル」との間の競合が後継者によって獲得されたと考えているようです。継承のない実際のコンテンツでは、マージツールで修正するための競合が発生します。 --ignore-ancestryは実際にsvn:mergeinfoプロパティを無視して暗黙的なパスベースの履歴情報を保持することができますが、ドキュメントがその点について明示的ではありません。

    一方、パッチのワークフローが流れているため、テキストコンテンツが2倍になっている理由があります。文脈がない場合(コンテキストは統一されたパッチ形式で欲しいものの、実際にはあなたのケースはありません)、パッチャーパッチを再度適用することをお勧めしますが、このアプローチでは通常、SubVersionのアプローチが適切です。別のパッチツールは、コンテキストがないことに気付き、これを "ファイルの開始"/"ファイルの終わり"のコンテキストを実行する必要性とみなして、パッチが失敗したと考えるかもしれません。