Ответ 1
Чтобы заменить пустые сообщения о фиксации некоторым шаблоном, вы можете сделать что-то вроде этого:
git filter-branch -f --msg-filter '
read msg
if [ -n "$msg" ] ; then
echo "$msg"
else
echo "The commit message was empty"
fi'
Недавно я преобразовал репозиторий svn с git svn
. К сожалению, в истории svn имеется несколько пустых сообщений о фиксации. Это проблема, когда я переустанавливаю и редактирую/переписываю фиксацию до самой последней фиксации без сообщения фиксации.
$ git rebase -i d01
[detached HEAD ff9839c] asdf
2 files changed, 9 insertions(+), 0 deletions(-)
Aborting commit due to empty commit message.
Could not apply 054e890...
$ git branch
* (no branch)
master
$ git commit --amend
fatal: You are in the middle of a cherry-pick -- cannot amend.
В этом примере я сделал сообщение фиксации для второго последнего фиксации с пустым сообщением о фиксации, и перезагрузка была остановлена на самом последнем коммите с пустым сообщением о фиксации.
Я хотел бы редактировать все коммиты с пустыми сообщениями одновременно. Есть ли способ, которым я могу это сделать? Может быть, я могу изменить все коммиты с пустым сообщением о фиксации, чтобы сначала зафиксировать сообщение "пусто"?
Чтобы заменить пустые сообщения о фиксации некоторым шаблоном, вы можете сделать что-то вроде этого:
git filter-branch -f --msg-filter '
read msg
if [ -n "$msg" ] ; then
echo "$msg"
else
echo "The commit message was empty"
fi'
Как я уже отмечал, это полностью разрушает комментарии, если у вас в них есть символы новой строки. Здесь perl script, который делает это без деструктивности:
#!/usr/bin/perl
my $data = "";
while(<STDIN>) {
$data .= $_;
}
if($data =~ /^\s*$/) { $data="[Empty message]\n"; }
print "$data";
Тогда просто git filter-branch -f --msg-filter /path/to/perlfilter.pl
Если у вас несколько строк, вы также можете использовать cat:
git filter-branch -f --msg-filter \
'msg=$(cat); if [ "$msg" = "" ]; then echo "Here was an empty commit message"; else echo "$msg"; fi'
Это позволяет обрабатывать сообщения с несколькими строками, а также сообщения, содержащие пустые строки для интервала.
Прерывание фиксации из-за сообщения о пустой фиксации.
У вас не будет этой проблемы с Git 2.17 (Q1 2018), так как "git rebase
" научился использовать новую опцию: "--allow-empty-message
".
См. совершить a6c612b (04 февраля 2018 г.) Genki Sky ( ``).
(слияние Junio C Hamano - gitster
- в commit 2f6128d, 21 февраля 2018 года)
rebase
: добавить--allow-empty-message
вариантЭтот параметр позволяет перехватывать сообщения с пустыми сообщениями фиксации, сопоставляя ту же опцию в
git-commit
иgit-cherry-pick
.
В то время как пустые сообщения журнала не одобряются, иногда их можно найти в более ранних версиях репозитории (например, переведенные из другой VCS) или другие причины для их желания.
Опция доступна вgit-commit
иgit-cherry-pick
, поэтому естественно использовать другие инструменты Git. Добавление этого параметра в качестве опции позволяет по умолчанию "дать пользователю возможность исправить", в противном случае не прерывая рабочий процесс пользователя.
Elan Ruusamäe подтверждает в комментариях:
работает как шарм. построенный с указанным фиксатором. +
git rebase --root HEAD --allow-empty-message
Successfully rebased and updated detached HEAD.
git checkout -B master
Вы можете использовать вишневый выбор:
git checkout -b temp_branch master
git checkout
git cherry-pick --allow-empty-message first_commit_to_include^..my_branch
# delete old my_branch and rename temp_branch to my_branch
git branch -D my_branch
git branch -m my_branch
Вы можете подтвердить и продолжить сообщение с пустой фиксацией:
Aborting commit due to empty commit message.
Could not apply XXX... XXX
$ git commit --allow-empty -C $(<"$(git rev-parse --git-dir)/rebase-merge/onto")
$ git rebase --continue