我有一个项目a,它是一个库,它被用于一个项目B。
项目A和B在github上都有一个单独的存储库,但在B内部我们有A的子模块。
我在库上编辑了一些类,它在repo A中,我在远程repo上推了一下,所以库(repo A)更新了。
这些更新不会反映在“引用”(子模块)上,子模块引用了以前的提交....我应该怎么做才能更新git上的子模块?
如果你更新了一个子模块并提交给它,你需要到包含的或更高级别的repo,并在那里添加更改。
git status
将显示如下内容:
modified: some/path/to/your/submodule
子模块不同步的事实也可以看出
git submodule
输出将显示:
+afafaffa232452362634243523 some/path/to/your/submodule
加号表示your子模块指向的位置比顶部repo期望它指向的位置要早。
只需添加以下更改:
git add some/path/to/your/submodule
并承诺:
git commit -m "referenced newer version of my submodule"
当您向上推更改时,请确保首先在子模块中向上推更改,然后在外部回购中向上推引用更改。这样,更新的人总是能够成功运行
git submodule update
关于子模块的更多信息可以在这里找到http://progit.org/book/ch6-6.html。
进入子模块目录:
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
将子模块更新为最新的远程提交。在大多数情况下都很方便。
单行版本
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 1.8你就可以做到了
这将把子模块更新为最新的远程提交。然后你需要添加并提交更改,这样父库中的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')"
其他一些答案建议在子模块的目录中合并/提交,IMO可能会变得有点混乱。
假设远程服务器名为origin,并且我们想要子模块的master分支,我倾向于使用:
origin
master
git submodule foreach "git fetch && git reset --hard origin/master"
注意:这将对每个子模块执行硬复位——如果你不想这样做,你可以将--hard改为--soft。
--hard
--soft
上面的答案对我都没用。
这是解决方案,从父目录运行:
git submodule update --init; cd submodule-directory; git pull; cd ..; git add submodule-directory;
现在你可以git commit和git push
git commit
解决方案1
简单点说。
运行此命令获取子模块的最新信息:
git submodule update --remote --merge or git submodule update --remote
现在,我们需要更新父repo中的引用,可以使用以下命令完成:
git add <<submodulesfoldername>>
注意:& lt;比;==我的子模块文件夹git add sub-modules的名称(记得提交和推送你的代码,最新提交的引用将被添加)
git add sub-modules
解决方案2
如果上面的解决方案不是最新的,试试这个:
git submodule update --init --recursive