Каждый раз, когда я делаю слияние, я должен для слияния фиксировать быть сгенерированным, и я хотел бы, чтобы оно имело больше, чем просто сводка всех фиксаций.
Мой вопрос состоит в том, как может я форматировать git-fmt-merge-msg или что определяет это автоматизированное сообщение (я могу сделать это вручную после фиксации путем исправления его и использования журнала мерзавца - pretty=format: '...')
Например, я хотел бы отформатировать его как таковой:
Merge branch 'test'
* test:
[BZ: #123] fifth commit subject
[BZ: #123] fourth commit subject
[BZ: #123] third commit subject
[BZ: #123] second commit subject
[BZ: #123] first commit subject
__________________________________________
Merge details:
[BZ: #123] fifth commit subject
at 2010-06-30 11:29:00 +0100
- fifth commit body
[BZ: #123] fourth commit subject
at 2010-06-30 11:22:17 +0100
- fourth commit body
[BZ: #123] third commit subject
at 2010-06-30 11:21:43 +0100
- third commit body
[BZ: #123] second commit subject
at 2010-06-30 11:21:30 +0100
- second commit body
[BZ: #123] first commit subject
at 2010-06-30 11:29:57 +0100
- first commit body
Вы можете попробовать определить ловушку prepare-commit-msg (пример действительно генерирует некоторые настраиваемые «сообщения фиксации по умолчанию»)
Теперь есть опция - log
для git-merge
, которая выполняет половину что вы хотите - он помещает короткий журнал (сводки фиксации) в сообщение слияния. Однако полное решение должно будет использовать хук, как в ответе VonC.
Я обнаружил, что есть два способа решения этой проблемы
примечание : не используйте оба одновременно, так как если фиксация не удастся объединить, она добавит бревно снова в самый низ.
личное примечание : я использую первое решение, поскольку оно полностью полагается на хуки и свойства конфигурации git, а не на внешний скрипт.
Для реального решения нужно было бы расширить команду git с именем 'fmt-merge-msg', которая генерирует однострочные описания при передаче параметра --log (если вам действительно нужно это решение, вам придется создать свой собственный патч (для git) и скомпилируйте его из исходного кода).
1. используя сообщение prepare-commit-message, как предложил VonC
, это решение имеет проблему, заключающуюся в том, что вам нужно прервать фиксацию, а затем выполнить фиксацию вручную
, установив псевдоним, который будет создавать желаемое сообщение фиксации:
[alias]
lm = log --pretty=format:'%s%n by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local
создание Ловушка prepare-commit-msg путем создания исполняемого файла prepare-commit-msg в $ GIT_DIR / hooks / (пример сценария ниже)
#!/bin/sh
#...
case "$2,$3" in
merge,)
echo "Merge details:" >> $1
echo "" >> $1
git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;
*) ;;
esac
следует определить псевдоним commit msg, такой как
[alias]
m = merge --no-ff --no-commit
2. с помощью специальной команды, которая автоматически сгенерирует слияние
(с использованием псевдонима lm, созданного в 1.)
#!/bin/sh
echo ""
echo "merge with commit details -- HEAD..$1"
git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1
, а затем выполните довольно жесткую команду:
./cmd-name <branch to merge>
, если вы все еще хотите иметь однострочное описание коммитов, вы вам нужно будет добавить новые команды или что-то еще в аргумент -m (если вы используете --log, он будет сгенерирован внизу)