Найти общий коммит в двух совершенно разных деревьях git

Следующий скрипт пытается найти самый новый общий коммит из двух веток. Коммиты должны иметь одинаковую тему, одного автора и одну и ту же дату. но дата фиксации и хэш разные. Из-за этого, git rebase не может найти эту ветку автоматически.

#!/bin/bash
lastbr=
lastrest=
revU=  # Update
revB=  # Base
rm -f rev.*.tmp
(
  git log --format='format:b %H %at %an %ae %f' master
  echo
  git log --format='format:u %H %at %an %ae %f' master_tmpnew
) | sort -r -t' ' -k3 | while read br rev rest; do
  echo "? $br $rev $rest"
  [ "$br" != "u" ] || revU="$rev"
  [ "$br" != "b" ] || revB="$rev"
  if [ "$lastrest" = "$rest" -a "$lastbr" != "$br" ]; then
    echo "found match: base $revB  updae $revU"
    echo "$revB" >rev.base.tmp
    echo "$revU" >rev.update.tmp
    break
  fi
  lastrest="$rest"
  lastbr="$br"
done
if [ ! -f rev.base.tmp ]; then
  echo "No matching revision found"
  exit 1
fi
revB="`cat rev.base.tmp`"
revU="`cat rev.update.tmp`"
git rebase --onto $revB $revU master_tmpnew

Вопрос: это решение выглядит не очень хорошо для меня. Кто-нибудь из вас имеет лучшее представление о том, как решить эту проблему, или уже есть решение?

Предыстория: я пытаюсь реализовать добавочный импорт CVS-to-GIT, используя инструмент cvs2git. Официально он не поддерживает добавочный импорт, но я нашел решение, похожее на этот обходной путь. Единственная проблема: у меня были проблемы с простой git rebase, Поскольку ветви не совпадают друг с другом (разные даты хеширования и фиксации из-за природы git2svn), он часто переписывает больше коммитов, чем необходимо, если я использую его без подробных ссылок (общий коммит). Проверьте это для готового к запуску сценария тестирования приведенного выше сценария.

1 ответ

Решение

Возможно, мерзавец может быть полезен. Он будет сравнивать наборы изменений, а не хеш коммита, чтобы определить, содержат ли два коммита одно и то же.

http://www.kernel.org/pub//software/scm/git/docs/git-cherry.html

Другие вопросы по тегам