请注意如果你有现有子模不是跟踪一个分支然后.如果你有git 1.8.2+):确保父回购知道它的子模块现在跟踪一个分支:cd /path/to/your/parent/repo
git config -f .gitmodules submodule..branch
确保您的子模块实际上是该分支的最迟部分:cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(以“原产地”为子模块已经从。
A git remote -v在该子模块中将显示它。通常,它是“起源”)不要忘记在父回购中记录子模块的新状态:cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
子模块的后续更新必须使用--remote备选方案:# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
请注意,与GIT 2.10+(2016年第三季度),你可以用‘.‘作为一个分支名称:分支的名称记录为submodule..branch在……里面.gitmodules为update --remote.
一种特殊的价值.用于指示子模块中分支的名称应与当前存储库中的当前分支同名。.
如果要更新分支后面的所有子模块:git submodule update --recursive --remote
注意,对于每个更新的子模块,结果将几乎总是分离头,如丹·卡梅隆注:他的回答.
(克林姆注记在评论中如果你跑了git submodule update --remote生成的SHA 1与子模块当前正在运行的分支相同,它不会执行任何操作,将子模块保留在“在该分支上”,而不处于分离的头状态。
以确保分支实际签出(这不会修改(代表父回购的子模块),他建议:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git checkout $branch'
每个子模块仍将引用相同的SHA 1,但如果您确实进行了新的提交,您将能够推送它们,因为它们将由您希望子模块跟踪的分支引用。
在子模块中的推送之后,不要忘记返回到父回购、添加、提交和推动那些修改后的子模块的新SHA 1。
注意使用$toplevel,建议在评论中通过亚历山大·波格.
$toplevel于2010年5月在git1.7.2中采用:承诺f 030c96.它包含顶层目录的绝对路径(其中.gitmodules)。Foreach脚本将无法签出不跟随分支的子模块。
但是,这个命令给出了两种方法:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ]
&& git checkout master || git checkout $branch' –
相同的命令,但更容易读懂:git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git checkout $branch' –git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
多行:git submodule foreach -q --recursive \
'git checkout \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'