Восстановление истории git с пустыми сообщениями фиксации

Недавно я преобразовал репозиторий 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.

В этом примере я сделал сообщение фиксации для второго последнего фиксации с пустым сообщением о фиксации, и перезагрузка была остановлена ​​на самом последнем коммите с пустым сообщением о фиксации.

Я хотел бы редактировать все коммиты с пустыми сообщениями одновременно. Есть ли способ, которым я могу это сделать? Может быть, я могу изменить все коммиты с пустым сообщением о фиксации, чтобы сначала зафиксировать сообщение "пусто"?

Ответы

Ответ 1

Чтобы заменить пустые сообщения о фиксации некоторым шаблоном, вы можете сделать что-то вроде этого:

git filter-branch -f --msg-filter '
read msg
if [ -n "$msg" ] ; then
    echo "$msg"
else
    echo "The commit message was empty"
fi'

Ответ 2

Как я уже отмечал, это полностью разрушает комментарии, если у вас в них есть символы новой строки. Здесь 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

Ответ 3

Если у вас несколько строк, вы также можете использовать cat:

git filter-branch -f --msg-filter \
 'msg=$(cat); if [ "$msg" = "" ]; then echo "Here was an empty commit message"; else echo "$msg"; fi'

Это позволяет обрабатывать сообщения с несколькими строками, а также сообщения, содержащие пустые строки для интервала.

Ответ 4

Прерывание фиксации из-за сообщения о пустой фиксации.

У вас не будет этой проблемы с 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 

Ответ 5

Вы можете использовать вишневый выбор:

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

Ответ 6

Вы можете подтвердить и продолжить сообщение с пустой фиксацией:

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