Git-修复子模块Head_detached的问题

Git-子模块Head detached的问题

更新了项目的code, 更新完之后执行 git status,发现子模块似乎发生了变化:

image-20221124144342779

提示有 “new commits”, 于是进入到子模块把子模块代码也给更新了一下,结果更新完了之后发现子模块的状态变成下面的样子:

image-20221124144719261

解决方案

  1. 进入到当前子模块的目录,执行:

    cd path/to/submodule
    # Assuming you're tracking the 'master' in the submodule
    git checkout master
    

    image-20221124145315818

    这样可以暂时修复 detached state.

  2. 回到主模块所在的目录,执行:

    # cd back to project root
    git submodule update --remote --merge
    # or
    git submodule update --remote --rebase
    

    更新所有子模块内容,如果你觉得每次执行 submodule update --remote --rebasesubmodule update --remote --merge 比较麻烦,你可以为这两条命令指定一个别名,如:

    git config alias.supdate 'submodule update --remote --merge'
    
    # do submodule update with
    git supdate
    

    这样你下次只需要执行 git supdate 就可以达到相同的效果了。

    image-20221124145820048

    经过如上操作后,子模块基本能恢复正常了。

    后面的内容如果不想看可以忽略。

    --------------------------------------------------- 华丽丽的分割线 -----------------------------------------------------

    Unix命令的设计哲学就是一个命令只会做一件事,这样就导致你通过 git submodule update --remote 来更新所有子模块的代码后,子模块的代码有被 pull 下来,但是没有跟原来的代码merge到一起,所以有时候还需要执行:git submodule update --rebase git submodule update --merge 来手动将这些代码合并到一起,有一种做法就是可以修改 git submodule update 的默认行为,让它在 pull 完子模块代码之后,自动进行merge:

    手动进行修改

    打开主模块的目录,找到主模块的.git 文件夹

    image-20221124152343793

找到里面的config文件,打开后修改子模块update的默认行为:

update = merge

image-20221124152803756

或者你通过执行下列命令进行配置:

git config -f .gitmodules submodule.$name.update merge

这样你下次再执行git submodule update --remote时就不用再显式指定 --rebase--merge了,它会根据这边的配置选项自动进行merge。

参考链接

  1. Why is my Git Submodule HEAD detached from master?
posted @ 2022-11-24 15:41  夜行过客  阅读(539)  评论(0编辑  收藏  举报