Git 损坏了? `git rebase -i` 的 `reword` 突然停止工作

问题描述 投票:0回答:1

TL;博士

我已经使用

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. 启动交互式变基。
  3. $ git rebase -i develop

  4. 编辑更改列表。
  5. pick 0a280af1 commit_1 pick 4c37991e commit_2 - pick 09191dca commit_3 + reword 09191dca commit_3 pick cb098966 commit_4 pick 670ce5d9 commit_5

  6. 出现提示时编辑提交消息。
  7. 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
    
    
  8. 解决方法

我有一个奇怪的解决方法。

    本地分叉存储库。
  1. $ cd /path/to/new_directory $ git clone /path/to/original_project

  2. 执行与上面
  3. 如何重现

    部分所示完全相同的步骤。

  4. 它就像一个魅力。
  5. 环境

    macOS Sonoma(M3 Apple Silicon)
  • Git 2.46.0(通过 Homebrew 安装)
  • 问题

如何调试问题?

git macos
1个回答
0
投票

Git 子模块的缓存(即

.git/modules

)已损坏。只需删除目录并重新初始化子模块即可解决问题。

但我不知道为什么。


此评论

中所写,我比较了在原始有问题的项目中执行的GIT_TRACE=1 git rebase -i develop的输出和在无问题的本地分支中执行的输出,发现我仅在前一种情况下初始化了Git子模块。

所以我尝试了以下步骤:

    我执行了
  1. git submodule deinit <directory name>

    来取消初始化前存储库中的子模块。之后

    reword
    就开始正常工作了。
    
    

  2. 也就是说,我确实需要子模块。于是我又执行了
  3. git submodule init

    。这让

    reword
    再次失败。
    
    

  4. 然后,在没有问题的分叉中,我执行了
  5. git submodule init

    。仍然

    reword
    正在工作。
    
    

  6. 此调试意味着
前存储库中的子模块的缓存(即

.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

    
    

  5. 现在
reword

又可以工作了。

    

© www.soinside.com 2019 - 2024. All rights reserved.