我有一个名为A的项目,它是一个库,并且被另一个名为B的项目使用。
A和B都在Github上拥有单独的代码库,但在B中我们嵌套了一个A的子模块。
我编辑了库中一些类(存储于A代码库),并将其推送到远程代码库,因此库(A代码库)已经更新。
这些更新不会反映在“引用”(即子模块)上,该子模块指向之前的提交.... 我该怎么做才能在git上更新子模块?
我有一个名为A的项目,它是一个库,并且被另一个名为B的项目使用。
A和B都在Github上拥有单独的代码库,但在B中我们嵌套了一个A的子模块。
我编辑了库中一些类(存储于A代码库),并将其推送到远程代码库,因此库(A代码库)已经更新。
这些更新不会反映在“引用”(即子模块)上,该子模块指向之前的提交.... 我该怎么做才能在git上更新子模块?
进入子模块目录:
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 update
。 - Kjulygit push
命令吗? - KR29git push <remote> <branch>
,例如 git push origin dev
。 - Kjulygit submodule update
只有在拉取了一个更新子模块引用的提交(在项目 B 中),才能在没有标志的情况下工作(在项目 A 中)。要将项目 B 更新为引用项目 A 远程跟踪分支的 HEAD
,您需要执行 git submodule update --remote --merge
,如 Paul Hatcher 在下面的回答中所示。 - Ben Burnsgit submodule update --remote --merge <path-to-submodule>
- ko80自 Git 1.8 版本以来,您可以执行以下操作:
git submodule update --remote --merge
这将更新子模块到最新的远程提交。然后,您需要添加并提交更改,以便在父存储库中更新gitlink:
首先,使用 git add 命令添加它。
git add project/submodule_proj_name
然后进行 git commit 操作
git commit -m 'gitlink to submodule_proj_name was updated'
推送 git
git push
如果不这样做,指向子模块的SHA-1标识将无法更新,因此更改对其他人来说将不可见。
git commit
,其他人仍然看不到它。
在主分支上
您的分支已经是 'origin/master' 的最新版本。
未提交的更改:
修改:SubmoduleA(新提交)
修改:SubmoduleB(新提交)
- Max Ngit add
进行暂存。 - joshnggit status
将显示类似于:
modified:
some/path/to/your/submodule
可以通过以下方式看出子模块是否未同步:
git submodule
输出结果将显示:
+afafaffa232452362634243523 some/path/to/your/submodule
加号表示你的子模块指向了比顶层仓库预期的更靠前的位置。
只需添加此更改:
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。
git submodule
时没有看到 +
,请确保已经初始化并导入了子模块。分别使用 git submodule init
和 git submodule update
命令进行操作。 - fureigh单行版本
git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
解决方案一
为了简化操作,运行以下命令获取子模块的最新版本:
git submodule update --remote --merge
or
git submodule update --remote
git add <<submodulesfoldername>>
git add sub-modules
(记得使用代码提交和推送,最新提交的引用将被添加)
解决方案 2
如果上述解决方案不能拉取最新版本,请尝试以下方法:
git submodule update --init --recursive
以上答案都不能解决我的问题。
以下是解决方案,在上级目录下运行:
git submodule update --init;
cd submodule-directory;
git pull;
cd ..;
git add submodule-directory;
现在你可以通过执行 git commit
和 git push
来提交代码。
其他一些答案建议在子模块目录内进行合并/提交操作,但我认为这可能会变得有点凌乱。
假设远程服务器的名称为origin
,我们想要子模块的master
分支,我倾向于使用:
git submodule foreach "git fetch && git reset --hard origin/master"
注意: 这将对每个子模块执行硬重置--如果您不希望这样,请将--hard
更改为--soft
。
git pull --rebase
Andy的回答对我有用,通过转义$path:
git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
git submodule update --remote --merge
,确保子模块指向最新的哈希值(在 git 1.8之后有效)。然后通过提交子模块来提交指向新哈希值的指针:git add proj/submodule
,然后执行git commit -m 'adding new submodule'
。我最喜欢的答案是这个:https://dev59.com/vGsy5IYBdhLWcg3w-i7h#42175412 - Charlie Parker