Git-运行UPDATE后,子模块头始终被分离? [英] Git - submodules HEAD is always detached after running update?
问题描述
我将子模块的此配置放在.gitMODULES文件中:
[submodule "sub"]
shallow = true
branch = master
path = sub
url = https://path/to/repo.git
现在我希望有人克隆我的repo,然后运行这些命令:
git submodule init
git submodule update
是得到子模的浅主分支。但发生的情况是,它不会签出到master
分支。它总是到达分离的头部,所以我需要手动运行git checkout master
。因此,用户需要另外运行一个命令,而不是这两个命令。
我调查了一下:Why is my GIT Submodule HEAD detached from master?
但任何关于公认答案的建议似乎都无济于事:我在.gitmodules
文件中添加了我想要的分支,我将远程上游添加为master(这仅适用于我必须签出以自己为主的已克隆/更新的存储库)。
那么,如果有人克隆我的存储库并希望设置子模块,这是否打算始终获得分离的头?
推荐答案
是的,您说得对。用户mkungla从Why is my GIT Submodule HEAD detached from master?发布的排名靠前的答案是无稽之谈。
在.gitmodule
中添加branch
选项与子模块的分离行为完全无关。
从git submodule --help
开始,分离头部是git submodule update --remote
的默认行为。
首先,不需要指定要跟踪的分支。origin/master
是要跟踪的默认分支。
--远程
不使用超级项目记录的SHA-1更新子模块,而是使用子模块的远程跟踪分支的状态。使用的远程是分支机构的远程(branch.<name>.remote
),默认为origin
。使用的远程分支机构默认为master
。
为什么
那么为什么在update
之后头部被分离?因为submodule.$name.update
的默认行为是checkout
。
--结账
将超级项目中记录的提交签出子模块中的分离的头。这是默认行为,此选项的主要用途是在设置为
checkout
以外的值时覆盖submodule.$name.update
。
方式
如果希望子模块自动与远程分支合并,请使用--merge
或--rebase
。
--合并
此选项仅对UPDATE命令有效。将超级项目中记录的提交合并到子模块的当前分支中。如果提供此选项,子模块的磁头将不会分离。
--更改基准
将当前分支重新定位到超级项目中记录的提交。如果提供此选项,子模块的磁头将不会分离。
您只需
git submodule update --remote --merge
# or
git submodule update --remote --rebase
还可以通过将submodule.$name.update
设置为merge
或rebase
,将--merge
或--rebase
设置为git submodule update
的默认行为。
这里有一个关于如何在.gitmodule
中配置子模块更新的默认更新行为的示例。
[submodule "bash/plugins/dircolors-solarized"]
path = bash/plugins/dircolors-solarized
url = https://github.com/seebi/dircolors-solarized.git
update = merge # <-- this is what you need to add
我的全部答案都是基于手册。git submodule --help
。
这篇关于Git-运行UPDATE后,子模块头始终被分离?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!