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

Другие вопросы по тегам