首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不分离头的git子模块替换

不分离头的git子模块替换
EN

Stack Overflow用户
提问于 2022-01-07 23:45:01
回答 1查看 82关注 0票数 1

我的情况:我有大量用于各种任务的计算机。我有大量的图书馆,每个图书馆都有自己的git。

My Re欲:我希望能够修改任何计算机上的一个库,执行git提交/推送;然后转到另一台计算机,执行git pull,并更新所有库。然后,我修改其中一个库,提交/推送,当我拿到下一台计算机时,一切都正常。

当前的尝试:我有一个顶级的git项目,它将所有其他库repos合并为子模块。这包括一个.gitmodules文件,它通过以下方法指定每个模块的工作分支

代码语言:javascript
复制
git config -f .gitmodules submodule.modulename.branch develop

我为每个模块设置了update = merge。我已经将submodule.recurse设置为true,所以顶层的git pull对每个模块都做了一些事情。

它是如何破碎的,:头变得分离。我编写了一个解析.gitmodules文件并对每个模块的适当分支执行checkout的脚本。然后我将commitpush放在最上面的模块上。每当我修改东西,尝试做拉,例如在另一台机器上,头就会分离。如果我没有注意到头在我开始修改之前是分离的,我必须仔细地解读残骸,然后才能做出改变。

在过去的十年中,对于git分离的头,确实存在3.6k堆栈溢出问题,而且大多数问题似乎来自子模块功能。我没有经历过所有这些,但我尝试过的并不成功。

我忘记了拒绝git-subtree的原因,但是git-subrepo已经一年多没有被访问过了,有153个问题和25个拉请求在等待,所以我认为它已经死了。

有人有办法解决这个问题吗?

接受@vonC的回答看起来不错。

我可能会精简一下这个程序,但是我的顶层项目的自述文件现在说:

建议结帐:

代码语言:javascript
复制
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

从存储库更新

代码语言:javascript
复制
git pullall

如果头被分离了,用

代码语言:javascript
复制
git switchall

添加模块

在下面的示例中,名为newmodule处理路径develop的模块。

代码语言:javascript
复制
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分支上,则仍然必须配置分支。

如果将子模块切换到不同的分支,则必须在顶层再次进行配置。

代码语言:javascript
复制
git config -f .gitmodules submodule.newmodule.branch newbranch

同时推送子模块和顶层项目。

在不同的工作目录上(例如在另一台机器上),您必须

代码语言:javascript
复制
cd /path/to/mysuperproject
git pull
git switchall
git pullall
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-08 00:07:51

I mentioned beforegit submodule update --remote --merge不应该分离分支后面的子模块的头。

我知道您已经设置了update = merge,但是只是为了测试,尝试完整的update命令,看看它是否有效。

由于HEAD仍然是分离的,所以需要添加命令(例如git别名脚本)。

代码语言:javascript
复制
git submodule foreach --recursive git switch $(git config -f .gitmodules submodule.${sm_path}.branch)

我刚测试过:

首先,在Git存储库中,我检查子模块是否处于分离的HEAD模式:

代码语言:javascript
复制
vonc@vclp MINGW64 ~/git/git (master)
$ git submodule update --init
Submodule 'sha1collisiondetection' (https://github.com/cr-marcstevens/sha1collisiondetection.git) registered for path 'sha1collisiondetection'
Cloning into 'C:/Users/vonc/git/git/sha1collisiondetection'...
Submodule path 'sha1collisiondetection': checked out '855827c583bc30645ba427885caa40c5b81764d2'


vonc@vclp MINGW64 ~/git/git/sha1collisiondetection (master)
$ git br
* (HEAD detached at 855827c)
  master

然后用转义的$\$定义我的别名。

访问../文件时不需要使用.gitmodules。这就是$toplevel的作用所在。

代码语言:javascript
复制
vonc@vclp MINGW64 ~/git/git (master)
$ git config alias.switchall \
    "submodule foreach --recursive 'git switch \$(git config -f \${toplevel}/.gitmodules submodule.\${sm_path}.branch)'"

最终测试:

代码语言:javascript
复制
vonc@vclp MINGW64 ~/git/git (master)
$ git switchall
Entering 'sha1collisiondetection'
Previous HEAD position was 855827c Detect endianess on HP-UX
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

vonc@vclp MINGW64 ~/git/git (tmp)
$ cd sha1collisiondetection/

vonc@vclp MINGW64 ~/git/git/sha1collisiondetection (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

vonc@vclp MINGW64 ~/git/git/sha1collisiondetection (master)
$ git branch
* master
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70628381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档