Как программно раздавить коммиты слияния в git, если они имеют одинаковое сообщение коммита?

Я использовал параметр git filter-branch --subdirectory-filter, чтобы извлечь два подкаталога из одного репо и объединить их в другое репо. Однако теперь мне нужно раздавить коммиты, потому что любая фиксация, касающаяся обоих подкаталогов, теперь дублируется в новом репо.

Чтобы исправить это, как я могу программно объединить все такие коммиты на основе некоторого правила? В моем случае я точно знаю, что если фиксация начинается с «Merge PR #PRNumber», где число такое же, это дубликат и его можно объединить.

Я думаю о написании скрипта, который будет смотреть на вывод "git log", затем находить эти дубликаты и делать git rebase --onto commitA commitB

Однако мне интересно, есть ли более быстрый/git-native способ сделать это. Кто-нибудь знает другие способы достижения этого?


person Shane    schedule 26.07.2019    source источник
comment
Довольно сложно пытаться следовать шагам, которые вы выполнили, не понимая структуру коммитов до и после ваших изменений в обоих репозиториях. Не могли бы вы показать сокращенное (или высокоуровневое) описание вашей истории?   -  person jpaugh    schedule 27.07.2019


Ответы (2)


Возможно, вам потребуется дополнительный шаг для изменения сообщений фиксации в диапазоне, но вы можете использовать git rebase для этого. Во-первых, добавьте fixup! к каждому из сообщений фиксации, которые вы хотите объединить, что говорит git, что он может автоматически сжать их в первую фиксацию в диапазоне с совпадающим сообщением. Затем запустите git rebase --interactive --autosquash и убедитесь, что он делает то, что вы ожидаете.

person 0x5453    schedule 26.07.2019
comment
Ваш совет о добавлении fixup! в начало вел бы себя совсем по-другому, если бы он был выполнен (новичком) после запуска git rebase --interactive и загрузки редактора. Мне потребовалось некоторое время, чтобы понять, хотя у меня есть опыт перебазирования. - person jpaugh; 27.07.2019

Я не уверен, как выглядит ваша история, обычно коммиты с сообщением Merge PR #PRNumber поступают из слияние фиксации, и это не дубликат. Однако ...

Я бы сделал журнал git, чтобы увидеть, как распределяются коммиты.

$ git log --oneline
$ git cherry-pick --squash <sha1>..<sha1>

Если ваше распределение коммитов, которые вы хотите раздавить, более рассредоточено, bash for loop будет работать (не уверен, находитесь ли вы на windows или linux), если вы можете легко определить (на основе сообщения, как вы говорите), какой из них вы хотите до squash сверху.

Если вы вставите сюда свой log --oneline, мы также можем помочь с автоматизацией.

person azbarcea    schedule 26.07.2019