0

私は、オープンソース プロジェクトでのマージを研究するための研究に取り組んでいます。

最近、Mercurial リポジトリで複数の親を持つすべてのコミットを見つけるにはどうすればよいですか? と尋ねました。、そして非常に良い答えを得ました。

ここで、クエリを絞り込んで、競合があったコミットのみを見つける必要があります。

競合とは、2 つの貢献するコミットで同じファイルが変更されたことを意味します。

また、同じ行が 2 人の貢献者によって変更されたコミットのみを提供する mercurial または bash (grep、awk?) コマンドを見つけることができれば、非常に便利です。

アイデアは、自動解決できないコミットを見つけることです。

では、Mercurial リポジトリで競合が発生したすべてのマージを見つけるにはどうすればよいでしょうか?

4

4 に答える 4

2

マージに競合があったかどうかを示すためにマージに何も記録されていないため、これらを見つける簡単な方法はありません。

2 つのブランチで変更されたファイルが必ずしも競合を構成するわけではないことに注意してください。ファイルが次の場合にのみ競合が発生します。

  1. マージ不可 (つまり、バイナリまたは類似)
  2. または、ファイル内の少なくとも 1 つの領域が両方のブランチで変更されました

あるブランチでファイルの上部を変更し、別のブランチでファイルの下部を変更し、それらが互いに十分に離れている場合 (通常、変更の間に数行あれば十分です)、これは競合することなくマージされます。

唯一のオプションは、両方のブランチで変更されたファイルを含む各マージを再生し、mercurial が競合なしにマージできないマージをメモすることです。

また、組み込みのクエリ構文を使用して、両方のブランチで同じファイルが変更されたマージを見つける方法も知りません。自分でログを掘り下げる必要があると思います (つまり、何らかのコードを使用します)。

于 2013-03-29T20:45:14.417 に答える
1

マージ リビジョンごとに、最初と 2 番目の親リビジョンに関連する、変更されたファイルのリストを取得できます。両方のリストに表示されるファイルは、おそらく競合しています。

サンプルは次のとおりです。

for rev in $(hg log -r "merge()" --template '{rev}\n'); do
    hg status --rev "p1($rev)" --rev $rev --no-status | sort > /tmp/p1
    hg status --rev "p2($rev)" --rev $rev --no-status | sort > /tmp/p2
    echo Conflicts in $rev:
    comm -1 -2 /tmp/p1 /tmp/p2
done

注: これはおそらく、名前が変更されたファイルには対応しません。「hg status」呼び出しに「--copy」を追加してみてください。

于 2013-04-05T12:21:28.790 に答える
0

フィルターを使用して、マージされたすべてのファイルを分離し、その親から分離することができます。ただし、マージの競合があるかどうかを確認するには、親を比較する必要があります。

于 2013-03-29T21:52:08.623 に答える