Я пользовался reword
инструкцией git rebase -i
без проблем в течение нескольких лет.
Однако он больше не работает только в одном из моих локальных репозиториев Git.
Как ни странно, проблема решается просто разветвлением репозитория локально.
Подтверждает, что перебазирование не выполняется и рабочий каталог чист.
$ git status
On branch x
nothing to commit, working tree clean
$ git rebase --abort
fatal: no rebase in progress
Запускает интерактивную перезагрузку.
$ git rebase -i develop
Редактирует список изменений.
pick 0a280af1 commit_1
pick 4c37991e commit_2
- pick 09191dca commit_3
+ reword 09191dca commit_3
pick cb098966 commit_4
pick 670ce5d9 commit_5
Редактирует сообщение фиксации при появлении соответствующего запроса.
reword
сам по себе успешен, но pick
сразу после этого терпит неудачу по неизвестной причине.
commit_4_{a|b}.txt
в сообщении об ошибке уже отслеживаются и commit_4
редактирует их.
Остальные коммиты (т. е. commit_{1|2|3|5}
) их не трогают.
Как было подтверждено на шаге 1 выше, на момент запуска рабочий каталог был чистым (без локальных изменений) git rebase -i
.
[detached HEAD 79925137] new_commit_3
Date: Mon Sep 2 15:55:29 2024 +0900
2 files changed, 185 insertions(+)
create mode 100644 commit_3_a.txt
create mode 100644 commit_3_b.txt
error: Your local changes to the following files would be overwritten by merge:
commit_4_a.txt
commit_4_b.txt
Please commit your changes or stash them before you merge.
Aborting
hint: Could not execute the todo command
hint:
hint: pick cb0989660941c763e6935d63105205e296a2c11f commit_4
hint:
hint: It has been rescheduled; To edit the command before continuing, please
hint: edit the todo list first:
hint:
hint: git rebase --edit-todo
hint: git rebase --continue
У меня есть странный обходной путь.
Локально разветвляет репозиторий.
$ cd /path/to/new_directory
$ git clone /path/to/original_project
Выполняет те же действия, что и в разделе «Как воспроизвести» выше.
Это работает как шарм.
macOS Sonoma (M3 Apple Silicon)
Git 2.46.0 (устанавливается через Homebrew)
Как я могу устранить проблему?
ТЛ;ДР
Кэш подмодуля Git (т. е. .git/modules
) был поврежден. Простое удаление каталога и повторная инициализация подмодуля решили проблему.
Хотя я не знаю почему.
Как написано в этого комментария, я сравнил выходные данные GIT_TRACE=1 git rebase -i develop
, выполненные в исходном проблемном проекте, и результаты, выполненные в не проблемной локальной вилке, и обнаружил, что я инициализировал подмодуль Git только в первом случае.
Итак, я попробовал следующие шаги:
Я выполнил git submodule deinit <directory name>
, чтобы деинициализировать подмодуль в бывшем репозитории. После этого reword
начал работать без проблем.
Тем не менее, мне нужен субмодуль. Поэтому я снова выполнил git submodule init
. Из-за этого reword
снова потерпел неудачу.
Затем в непроблемной вилке я выполнил git submodule init
. Тем не менее reword
работал.
Эта отладка подразумевает кеш подмодуля (т. е. .git/modules) в бывшем репозитории был поврежден (хотя git gc
и git fsck
не работали).
Это не должно иметь значения, поскольку серия перебазируемых коммитов совершенно не имеет отношения к содержимому подмодуля и не зависит от него. Но в любом случае я попробовал:
git submodule deinit <directory name>
mv .git/modules/ .git/modules.bak
(удаляет кеш подмодуля)
git submodule init
git submodule update
Теперь reword
снова работает.