我的情况:我有大量用于各种任务的计算机。我有大量的库,每个库都有自己的 git repo。
我的愿望:我希望能够在任何计算机上修改其中一个库,执行 git commit/push;然后转到另一台计算机,执行git pull
,并更新所有库。然后我修改其中一个库,提交/推送,当我拿到下一台计算机时,一切正常。
我目前的尝试:我有一个顶级 git 项目,它将所有其他库 repos 合并为子模块。这包括一个 .gitmodules 文件,该文件通过使用指定每个模块的工作分支
git config -f .gitmodules submodule.modulename.branch develop
我已经update = merge
为每个模块设置了。我已经submodule.recurse
设置为 true,所以git pull
在顶层对每个模块做一些事情。
它是如何被打破的: 头变得分离。我编写了一个脚本来解析.gitmodules
文件并执行checkout
每个模块的相应分支。我然后commit
和push
顶部模块。每当我修改东西并尝试拉动时,例如在另一台机器上,头部就会分离。如果我在开始修改之前没有注意到头部已分离,我必须在提交更改之前仔细整理残骸。
在过去的十年里,实际上有 3.6k 的关于 git 分离头的堆栈溢出问题,而且大多数似乎来自子模块功能。我还没有经历所有这些,但我尝试过的没有奏效。
我忘记了为什么我拒绝了git-subtree
,但git-subrepo
一年多没有接触过,有 153 个问题和 25 个拉取请求待处理,所以我认为它已经死了。
有没有人对此有有效的解决方案?
@vonC 接受的答案看起来不错。
我可能可以稍微简化一下,但是我的顶级项目的自述文件现在说:
推荐结帐:
git clone --recursive --jobs=8 *mysuperproject_clone_url*
cd *mysuperproject*
git config alias.pullall 'submodule foreach git pull'
git config alias.statusall 'submodule foreach git status'
git config alias.switchall \
"submodule foreach --recursive 'git switch \$(git config -f \${toplevel}/.gitmodules submodule.\${sm_path}.branch)'"
git switchall
从存储库更新
git pullall
如果头部脱落,请使用
git switchall
添加模块
在以下示例中名为newmodule
working on path的模块。develop
cd /path/to/mysuperproject
git submodule add git@github.com:myaccount/newmodule
git config -f .gitmodules submodule.newmodule.branch develop
git config -f .gitmodules submodule.newmodule.update merge
如果子模块在默认master
分支上,您仍然需要配置该分支。
如果将子模块切换到不同的分支,则必须在顶层重新配置
git config -f .gitmodules submodule.newmodule.branch newbranch
并推送子模块和顶级项目。
在不同的工作目录(例如在不同的机器上),您必须
cd /path/to/mysuperproject
git pull
git switchall
git pullall