Вы говорите определенные сценарии , но на самом деле 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
, чтобы собрать все сообщения о коммитах из коммитов, которые вы комбинируете.