Я хотел сделать что-то подобное.Я не нашел разумного способа заставить git fmt-merge-msg
работать.Я думаю, что это не работает так, как я надеялся (передавая совершенно другой текст, который можно использовать для сообщения).Поэтому вместо этого я нашел другой способ, используя команды -no-commit
и commit -F
.Вывод, конечно, настраиваемый, но он почти точно отражает то, что вы сказали, что хотите, чтобы вывод был.
Пример вывода сообщения о фиксации:
Merge branch fix4 into master
::SUMMARY::
Branch fix4 commits:
Add fix4b-4
Add fix4b-3
Add fix4b-2
Add fix4b-1
Branch master commits:
fix4b-5 on master
* * * * * * * * * * * * * * * * * * * * * * * * *
::DETAILS::
commit < 98ffa579e14610b3566e1a3f86556a04dc95a82b
Author: -----
Date: Fri Aug 17 17:23:26 2018 -0400
fix4b-5 on master
commit > 7e386dddee16a7c2588954d25dd6793cdaa1b562
Author: -----
Date: Fri Aug 17 15:18:17 2018 -0400
Add fix4b-4
use log output as commit message
commit 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > c9bb199be49c17ca739d019d749263314f05fc46
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-2
commit > 5b622a935c9d078c7d0ef9e195bccf1f98cce5e4
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-1
И использование будет:
$ git mergelogmsg branch-name
Я скопирую псевдоним здесь:
[alias]
mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && git log --format=format:'%s' $var..$1 >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' $1..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var...$1 >> temp_merge_msg && git merge --no-ff --no-commit $1 && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
Если вы хотите скопировать и вставить его, чтобы настроить его, используйте выше.В приведенной ниже версии есть разрывы строк, которые вам не нужны, но я буду объяснять, что я делаю:
[alias]
1 mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) &&
2 printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg &&
3 git log --format=format:'%s' $var..$1 >> temp_merge_msg &&
4 printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg &&
5 git log --format=format:'%s' $1..$var >> temp_merge_msg &&
6 printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg &&
7 git log --left-right $var...$1 >> temp_merge_msg &&
8 git merge --no-ff --no-commit $1 &&
9 git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
Хорошо ...
Строка 1 запускает пользовательскую функцию как скрипт оболочки bash, поэтому git знает, что это не команда git.Он устанавливает текущую ветку (master, если вы объединяете другую ветку в master) в переменную, чтобы мы могли использовать ее позже.
Строка 2 печатает первую строку, используя текущую ветку и имя ветвиВы дали исходную команду (так же, как и в обычной команде слияния).Он записывает это во временный файл.
Строка 3 получает журнал коммитов во входящей ветви, которых нет в текущей ветке, и записывает только темы этих коммитов во временный файл.
Строка 4 выводит следующую строку в темп.
Строка 5 получает журнал коммитов в текущей ветви, которых нет во входящей ветви, и записываеттолько темы этих коммитов во временный файл.
Строка 6 печатает небольшой горизонтальный разделитель между частями суммирования и детализации.
Строка 7 получает журналвсе коммиты в текущем и входящем ветвях возвращаются ко времени сразу после того, как они разветвились друг от друга или в последний раз поделились с предком.Слева направо показывает стрелку, которая показывает, из какой ветви происходит коммит.<означает текущую ветвь, а> означает входящую ветвь.
Строка 8 выполняет команду слияния с входящей ветвью без быстрой перемотки вперед (поэтому вы получаете фиксацию) и без фиксации (так что вам нужноНапишите один сам ... ах, но вы этого не сделаете!)
Строка 9 выполняет команду фиксации с параметрами -e
и -F
, чтобы разрешить редактирование и сообщить о фиксации для заполнениясообщение с текстом в указанном файле.Как только вы закончите сообщение коммита, как вам нужно, оно завершит слияние и удалит временный файл.
Tada!Два ;
в конце этой длинной команды делают так, чтобы функции printf не записывали в консоль, а только в файл.