Git поврежден? `reword` `git rebase -i` внезапно перестал работать

ТЛ;ДР

Я пользовался reword инструкцией git rebase -i без проблем в течение нескольких лет.

Однако он больше не работает только в одном из моих локальных репозиториев Git.

Как ни странно, проблема решается просто разветвлением репозитория локально.

Как размножать

  1. Подтверждает, что перебазирование не выполняется и рабочий каталог чист.

    $ git status
    On branch x
    nothing to commit, working tree clean
    
    $ git rebase --abort
    fatal: no rebase in progress
    
  2. Запускает интерактивную перезагрузку.

    $ git rebase -i develop
    
  3. Редактирует список изменений.

    pick 0a280af1 commit_1
    pick 4c37991e commit_2
    - pick 09191dca commit_3
    + reword 09191dca commit_3
    pick cb098966 commit_4
    pick 670ce5d9 commit_5
    
  4. Редактирует сообщение фиксации при появлении соответствующего запроса.

  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
    

Обходной путь

У меня есть странный обходной путь.

  1. Локально разветвляет репозиторий.

    $ cd /path/to/new_directory
    $ git clone /path/to/original_project
    
  2. Выполняет те же действия, что и в разделе «Как воспроизвести» выше.

  3. Это работает как шарм.

Среда

  • macOS Sonoma (M3 Apple Silicon)

  • Git 2.46.0 (устанавливается через Homebrew)

Вопрос

Как я могу устранить проблему?


1
54
1

Ответ:

Решено

ТЛ;ДР

Кэш подмодуля Git (т. е. .git/modules) был поврежден. Простое удаление каталога и повторная инициализация подмодуля решили проблему.

Хотя я не знаю почему.


Как написано в этого комментария, я сравнил выходные данные GIT_TRACE=1 git rebase -i develop, выполненные в исходном проблемном проекте, и результаты, выполненные в не проблемной локальной вилке, и обнаружил, что я инициализировал подмодуль Git только в первом случае.

Итак, я попробовал следующие шаги:

  1. Я выполнил git submodule deinit <directory name>, чтобы деинициализировать подмодуль в бывшем репозитории. После этого reword начал работать без проблем.

  2. Тем не менее, мне нужен субмодуль. Поэтому я снова выполнил git submodule init. Из-за этого reword снова потерпел неудачу.

  3. Затем в непроблемной вилке я выполнил git submodule init. Тем не менее reword работал.

Эта отладка подразумевает кеш подмодуля (т. е. .git/modules) в бывшем репозитории был поврежден (хотя git gc и git fsck не работали).

Это не должно иметь значения, поскольку серия перебазируемых коммитов совершенно не имеет отношения к содержимому подмодуля и не зависит от него. Но в любом случае я попробовал:

  1. git submodule deinit <directory name>

  2. mv .git/modules/ .git/modules.bak (удаляет кеш подмодуля)

  3. git submodule init

  4. git submodule update

Теперь reword снова работает.