0

次のシナリオがあります: 1 つのブランチでいくつかのコミットを行い、新しいブランチで UML モデルからコードを生成するツールを使用しました。残念ながら、このツールはやや機能が悪く、ラウンドトリップ生成を適切にサポートしていません。したがって、私のコードはすべて削除され、生成されたスケルトンのみが保持されました。

これらの 2 つのブランチを、両方のバージョンのファイルのすべての行を保持して (理想的には、各ファイルで mergetool をトリガーして) マージしたいと考えています。

私がこれまでにやったこと:

作業ツリーのルートにシェル スクリプトを作成しました。

#!/bin/sh
echo "union merge"
git merge-file --union "${1}" "${2}" "${3}"
exit 1 # trigger merge conflict

.gitattributes ファイルを作成しました:

**.cpp merge=mytool
**.h merge=mytool

そして私の.gitconfigを編集しました:

[merge "mytool"]
name = union merge
driver = ./union-merge.sh %A %O %B

.gitattributes ファイルが実際にすべてのファイルのマージ属性を設定していることを確認できます。

$ git check-attr -a src/file.cpp
customn/appopt.cpp: マージ: mytool

ただし、スクリプトは実行されていません (確認のためにエコーを追加しました)。代わりに、通常の git マージが実行され、他のブランチの内容が残ります。どうすればこれを適切に行うことができますか?

編集.: いくつかの詳細情報:

これが歴史です

    A --- B ------- D (マスター)
           \ /
            ---C--- (ツールブランチ)

Bで、変更をコミットしました。そこから新しいブランチを作成し、上記のコード ジェネレーターを使用してメソッド スケルトン (および必要ないくつかのマーカー コメントを使用) を生成しました。以前のモデルはAに基づいていたため、このステップでBの変更が削除され、ツールブランチでこのコードをコミットしました。ここで、 masterにマージし直して、 BCの両方のコンテンツを保持し、実装をメソッド スケルトンに手動で挿入できるようにしたいと考えています。ここでの問題は、コミットCで行が合法的に削除され、新しいメソッドのスケルトンが挿入されたと見なされるため、git がこれを競合と見なさないことです。

4

1 に答える 1

0

うーん、あなたの問題が正しいかどうかはわかりませんが、基本的に amergetoolはマージ時に自動的に実行されません。

標準的なワークフローは、 を作成しgit merge、競合が発生した場合に git がそのことを通知するので、問題を解決する方法を決定します。次に、それgit mergetoolを解決するためにどのツールを使用するかを尋ねられます。union-merge上記のように設定した後ENTERは、スクリプトを呼び出してこれらのファイルのカスタム処理を行うだけで済みます。

于 2013-05-27T11:06:29.710 に答える