Пустое имя идентификатора ветки фильтра git (для <>) не допускается

Мне нужно использовать git filter-branch переписать историю репозитория. Кажется, что какую бы команду filter-branch я ни пробовал, она складывается в один конкретный коммит с пустой ошибкой имени пользователя. Например:

git filter-branch --tree-filter 'rm -f -R a_folder' -- --all

дает

Rewrite 1acdc25e87c404e974610b9517f62b4127c3ccac (1574/3846) (43 seconds passed, remaining 62 predicted)
fatal: empty ident name (for <>) not allowed
could not write rewritten commit

Если я тогда сделаю:

git show 1acdc25e87c404e974610b9517f62b4127c3ccac

Я получаю следующее:

commit 1acdc25e87c404e974610b9517f62b4127c3ccac
Author:  <>
Date:   Mon Apr 27 19:31:42 2015 +0100

My Commit comment

diff --git a/file.cpp b/file.cpp
index 4db77cf..21b6fc0 100644
--- a/file.cpp
+++ b/file.cpp
@@ -50,6 +50,20 @@ E-mail: myEmail@mydomain.com

...Things I modified...

Так что, похоже, проблема заключается в том, что имя коммиттера пусто. Однако, если я посмотрю на исходный коммит, который переписывается здесь (таким образом, с тем же комментарием и изменениями), я вижу, что имя и адрес электронной почты коммиттера в порядке:

commit a1aa0612f35af3acf376938d355da0ecca6376a6
Author: My Name <myEmail@mydomain.com>
Date:   Mon Apr 27 19:31:42 2015 +0100

    My Commit comment

Я использую git версии 2.7.4 в Ubuntu 16.04.4.

Некоторое время назад я без проблем выполнил операции перезаписи в этом же хранилище. Только на другой машине, к которой у меня больше нет доступа.

Возможно ли столкнуться с ошибкой в ​​этой версии git? Любая идея о том, как устранить проблему? Конечно, я пытался искать помощь в Интернете, но пока не смог найти никого, кто сталкивался бы с чем-нибудь подобным.

2 ответа

В качестве диагностического шага вы можете попробовать выполнить ту же операцию с помощью BFG Repo-Cleaner:

$ bfg --delete-folders a_folder

Если BFG также дает сбой, возможно, в вашем хранилище есть какой-то поврежденный объект git, который не может прочитать ни реализация Git, ни C-Git, ни JGit (библиотека Java, используемая BFG).

Если BFG работает, вы, возможно, столкнулись с ошибкой в ​​ветке git-filter, о которой стоит сообщить в список рассылки git, как только вы убедились, что это происходит в последней версии Git (в настоящее время v2.17.0).

В конце концов я обнаружил, что было два одинаковых коммита с одинаковыми комментариями и модификациями, но один из них был с пустым идентификатором.

git log -grep='My commit comment'

возвращал только тот, у которого была правильная личность, так что его было трудно обнаружить. Я нашел это с помощью gitk показывая все ветки и коммиты, отсортированные по дате.

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