【问题标题】:Git submodule to track remote branch用于跟踪远程分支的 Git 子模块
【发布时间】:2013-11-27 23:03:10
【问题描述】:

我正在尝试使用 git 子模块将 10 多个存储库聚合到一个结构中以便于开发。

它应该克隆模块并签出一个分支。 相反,模块以分离头模式签出。

git clone git@github.com:org/global-repository.git
git submodule update —init
cd config-framework
git status

$git status
#HEAD detached at b932ab5
nothing to commit, working directory clean

gitmodules 文件好像没问题

$cat .gitmodules 
[submodule "config-framework"]
        path = config-framework
        url = git@github.com:org/config-framework.git
        branch = MY_BRANCH

我们希望默认签出 MY_BRANCH 分支,而不是分离头。 我们如何做到这一点?

【问题讨论】:

标签: git git-branch git-submodules git-remote


【解决方案1】:

为了完成这项工作,我总是使用以下命令(稍微基于前面的 VonCs 提议:

export top=$(pwd)
git submodule foreach --recursive 'b=$(git config -f ${top}/.gitmodules submodule.${path}.branch); case "${b}" in "") git checkout ${sha1};; *) git checkout ${b}; git pull origin ${b};; esac'

它检查所有子模块(递归地)在它们的“右”分支(如果设置),否则在最后提交的头部。

【讨论】:

  • 有趣的方法,但我认为这些天一个简单的git submodule update --remote --recursive 就足够了(Git 2.18+)
  • 这种方法的问题是(虽然我还没有在 2.18+ 上测试它)它会更新所有子模块,如果我理解正确的话,也会更新那些没有远程跟踪分支的子模块。现在,我的子模块结构基本上由一个存档(其中所有子模块都被冻结到一个给定的 sha)和一些需要跟踪的子模块组成。当前的子模块系统似乎无法区分这些。此外,我的方法允许选择性获取......(我知道,我有非常具体的需求;-))
  • 我同意。 +1。我虽然我以前用过类似的方法......在我的一个旧答案中:stackoverflow.com/a/18799234/6309。请注意,您可以从更新中排除子模块:stackoverflow.com/a/43441315/6309
  • “如果我理解正确的话,还有那些没有远程跟踪分支的人”:......遗憾的是,是的。我在两年前的stackoverflow.com/a/37924157/6309 中说明了这一点。
  • 啊,我以为我们讨论了另一个问题。一如既往的出色解释:-)
【解决方案2】:

如果您的计划是为子模块做出贡献,最好的方法是将其作为常规 git 存储库单独检查。您是否在使用不同遥控器的分支机构工作。然后将您的子模块指向您要用于测试的单个遥控器。

【讨论】:

    【解决方案3】:

    子模块总是detached HEAD mode 中签出。

    这是因为子模块会检查存储在 special entry in the index of the parent repo 中的 SHA1。

    另外,如果你想让一个子模块跟随你在.gitmodules注册的分支,你需要:

    git submodule update --init --remote
    

    --remote 将生成一个git fetch,以及新的HEAD 的结帐。
    唉,即使签出也是提交,而不是分支(因为默认情况下您在子模块中没有本地分支),所以...回到分离的HEAD 模式。
    在“Git submodules: Specify a branch/tag”查看更多信息。

    您可以尝试(未测试)a:

    git submodule foreach 'git checkout -b $(git config -f /path/to/parent/repo/.gitmodules --get submodule.$path.branch)'
    

    我利用git submodule foreach 可以访问“$path”这一事实,即相对于超级项目的子模块目录的名称。


    曾尝试为要自动签入的子模块指定一个分支(commit 23d25e4 用于 Git 2.0)......但它被逆转了(commit d851ffb,2014 年 4 月 2 日)!
    它可能很快就会出现,但不是在当前的实现中。

    【讨论】:

    猜你喜欢
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2014-11-04
    • 2015-02-25
    • 2014-02-04
    • 2010-10-05
    相关资源
    最近更新 更多