我有一个项目a,它是一个库,它被用于一个项目B。

项目A和B在github上都有一个单独的存储库,但在B内部我们有A的子模块。

我在库上编辑了一些类,它在repo A中,我在远程repo上推了一下,所以库(repo A)更新了。

这些更新不会反映在“引用”(子模块)上,子模块引用了以前的提交....我应该怎么做才能更新git上的子模块?


当前回答

其他一些答案建议在子模块的目录中合并/提交,IMO可能会变得有点混乱。

假设远程服务器名为origin,我们想要子模块的主分支,我倾向于使用:

Git子模块foreach“Git取回&& Git重置——硬源/主”

注意:这将对每个子模块执行硬复位——如果你不想这样做,你可以将——hard改为——soft。

其他回答

自从git 1.8你就可以做到了

git submodule update --remote --merge

这将把子模块更新为最新的远程提交。然后你需要添加并提交更改,这样父库中的gitlink就会更新:

首先,git添加它

git add project/submodule_proj_name

然后git提交

git commit -m 'gitlink to submodule_proj_name was updated'

git推它

git push

然后推送更改,因为如果没有这个,指向子模块的SHA-1标识将不会更新,因此更改对任何人都不可见。

安迪的回应为我工作通过转义$path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

我的项目应该为子模块使用'latest'。在Mac OSX 10.11, git版本2.7.1上,我不需要“进入”我的子模块文件夹来收集它的提交。我只是做了常规

git pull --rebase 

在顶层,它正确地更新了我的子模块。

单行版本

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

进入子模块目录:

cd projB/projA

从你的项目A中取出回购(不会更新你的父项目B的git状态):

git pull origin master

回到根目录并检查更新:

cd ..
git status

如果子模块之前更新过,它将显示如下内容:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

然后,提交更新:

git add projB/projA
git commit -m "projA submodule updated"

更新

正如@paul指出的,自从git 1.8以来,我们可以使用

git submodule update --remote --merge

将子模块更新为最新的远程提交。在大多数情况下都很方便。