6

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

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

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

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

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

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

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

4

1 に答える 1

4

マージ コミットが作成されると、マージがどのように実行されたかという情報は、残念ながら失われます。git mergeこれは、戦略や戦略ごとのオプションなど、競合の外観に影響を与える多くのオプションを受け入れるため、重要です。ただし、デフォルトのマージ オプションとの競合を引き起こす可能性のあるマージを見つけるという合理的なケースをカバーすることが目標である場合は、力ずくで実行することができます。マージ コミットを調べて、それらのマージを再作成し、git が報告するものにフラグを立てます。 .

注: このスクリプトは、多くの異なるコミットをチェックアウトし、すべての反復で実行されますgit reset --hardgit clean -fdxgit に認識されていない重要なファイルを含まないチェックアウトでのみ実行してください。

#!/bin/bash

old_branch=$(git symbolic-ref --short HEAD)
for commit in `git rev-list --merges HEAD`
do
  # find the parents of the merge commit
  parents=$(git log -1 --format=%P $commit)
  fst=${parents%% *}
  rest=${parents#* }
  # check out the first parent
  git checkout -q $fst
  # merge with the rest of them
  git merge --no-commit $rest >/dev/null 2>&1
  # if there are any conflicts, print the commit and abort the merge
  if git ls-files --unmerged | grep -q '^'; then
    echo $commit
    git merge --abort
  fi
  # get rid of changes so the next checkout doesnt complain
  git reset -q --hard
  git clean -fdxq
done
git checkout -q $old_branch
于 2013-03-29T22:03:17.527 に答える