Git diff и исправленные почтовые патчи - PullRequest
0 голосов
/ 23 февраля 2019

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

1 Ответ

0 голосов
/ 23 февраля 2019

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

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

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

Лучшее -по крайней мере, лучший встроенный способ сохранить такие коммиты и передать их через разрыв сети, который не позволяет git fetch или git push, - это превратить их в пакет Git .По сути, пакет - это половина операции 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 читает stdin для его сообщения о коммите, вы можете использовать git log, возможно, с --pretty=format:%B, чтобы собрать все сообщения о коммитах из коммитов, которые вы комбинируете.

...