Git diff и испорченные исправления электронной почты

В некоторых сценариях git format-patch не будет включать коммит слияния или будет генерировать исправления таким образом, что их нельзя будет применить корректно. В этих сценариях я хотел бы использовать git diff для создания сжатого патча в формате электронной почты/mbox, а также чтобы он сжимал сообщения фиксации в одно, чтобы сохранить хотя бы некоторую историю. Есть ли удобный способ сделать это?


person tesserakt    schedule 22.02.2019    source источник


Ответы (1)


Вы говорите определенные сценарии, но на самом деле git format-patch никогда не форматирует фиксацию слияния, потому что не знает, как это сделать. Он также не будет форматировать пустой патч (что может объяснить относительно сильную настойчивость Git в том, чтобы не делать «пустые», т. е. без изменений, коммиты). Но да, если ваш диапазон коммитов включает слияние (на самом деле одно или несколько), вы создаете себе проблемы.

В этих сценариях я хотел бы использовать git diff для создания сжатого патча в формате электронной почты/mbox, а также чтобы он сжимал сообщения фиксации в одно, чтобы сохранить хотя бы некоторую историю. Есть ли удобный способ сделать это?

Короткий ответ — нет, потому что никогда не бывает очевидно — по крайней мере, в механическом смысле — что здесь делать.

Лучший (по крайней мере, лучший встроенный) способ сохранить такие коммиты и передать их через сетевую брешь, которая не позволяет git fetch или git push, — превратить их в Git bundle. Пакет, по сути, является половиной операции git fetch или git push. Вы можете отправить пакет на другой компьютер с помощью любого механизма передачи, который вам нравится, затем на другом компьютере используйте git fetch, чтобы перенести его коммиты в ваш репозиторий на другом конце. См. также Почему я не могу объединить всех родителей?

В противном случае вы можете попытаться использовать git cherry-pick или команду, которая запускает ее для вас, git rebase (вероятно, в интерактивном режиме), чтобы превратить вашу строку коммитов, включая слияния, в более линейную строку коммитов. Поскольку никогда не бывает очевидным, что делать с точками слияния, вам придется справляться с этим самостоятельно каким-то другим способом. Полученную серию линейных коммитов можно передать в git format-patch.

Если вы хотите превратить все в один массивный коммит, вы можете просто запустить git diff на двух конечных точках (начальный коммит и конечный), а также запустить git log для сбора сообщений журнала. Форматирование их в сообщение в стиле почтового ящика довольно тривиально. Или, если вы хотите, вы можете использовать git commit-tree для написания коммита, который использует конечное дерево, но устанавливает его родителя в начальную точку, которая вам нравится, а затем используйте git format-patch для форматирования этого единственного коммита. Поскольку git commit-tree читает стандартный ввод для своего сообщения о коммите, вы можете использовать git log, возможно, вместе с --pretty=format:%B, чтобы собрать все сообщения коммитов из коммитов, которые вы комбинируете.

person torek    schedule 22.02.2019
comment
Да, git diff это путь, по которому мне нужно идти. Спасибо за совет в конце о том, как объединить три инструмента, чтобы добиться того, чего я хочу. Я посмотрю на это. - person tesserakt; 24.02.2019