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