git submodule init没有提取最新提交

时间:2012-12-12 17:10:49

标签: git git-submodules

我有一个git repo,里面有一个git子模块。子模块托管在bitbucket上。我想将子模块的本地副本更新为其最新提交。我厌倦了“ git submodule update ”但是没有做任何事情。所以我尝试删除子模块文件夹,然后执行“ git submodule init ”但是它只是提取初始子模块提交,而不是最新的。

如何让我的本地子模块更新到最新的提交?

4 个答案:

答案 0 :(得分:33)

Git正在做他应该做的事情。 git submodule update会将子模块设置为父repo中当前提交指定子模块应该在的子模块。这样你可以检查另一个分支,旧的提交或标记,然后运行git submodule update,子模块将被设置为引用所期望的内容,这样你的整个解决方案就会满足它的依赖性。

您需要做的是:

cd mysubmoduledir
git fetch
git checkout master # or any other branch that you need the latest of
git merge origin/master
cd -  # go back to the top repo
git status # should show that your submodule changed
git add mysubmoduledir
git commit -m "Updated my solution to use latest sub project."

更短的版本是:

cd mysubmoduledir
git pull # assumes you are already on the branch you need to be on
cd -
git commit -am "Updated submodule" # assumes you had no other modified files

“更新”一词不是这个子模块命令的最佳选择。它实际上意味着“将子模块指向父repo的提交所期望的提交”。

将子模块更新到另一个提交(不一定是最新的)需要你进入该目录,像常规git repo一样操作它,这样当前的提交就是你想要的,然后返回并提交这是顶级回购的变化。

答案 1 :(得分:9)

每个包含子模块的git提交都与子模块存储库中的特定提交相关联。

提供git submodule update命令以将子模块的签出版本更新为为父存储库的当前版本记录的提交。这实际上可能是您当前在该子模块中检出的旧版本,例如,如果您正在检查使用较旧版本子模块的旧版本的父存储库。

要获得更新版本的子模块,请切换到该目录并像更新任何其他git存储库一样进行更新(例如,从上游存储库中取出)。如果您进行任何新提交,或者从与用作子模块源的存储库不同的存储库中提取,请确保将更改推送出去。完成此操作后,您可以返回到父存储库并将更改提交到子模块,以记录您当前用于当前版本的子模块以及将来版本的新子模块提交,直到您进行另一次更新。

答案 2 :(得分:9)

添加子模块后,只需尝试以下命令即可。

for git v 1.8.x

git submodule update --init --recursive --remote

for v1.7.x:

git submodule update --init --recursivegit pull --recurse-submodules

for v1.6.x

git submodule foreach git pull origin master

检查你的git版本。

git version

答案 3 :(得分:0)

这里有点违反直觉的问题(或者至少对我来说是这样):如果主存储库的最新版本与子模块不同步,那么当您尝试通过运行来“更新”子模块时git submodule update从主存储库中只会提取父项中指定的最新更改,而不是子模块中的最新更改。

换句话说,您的父项目可能指向子模块的错误提交。为确保您的父级指向最新的子模块提交(这就是我想要的情况),请导航到子模块并运行git pull,然后返回父级并运行git add .

接下来,如果运行git diff命令,您会注意到,尽管主存储库中的文件都没有更改,但是您会收到一条dirty消息,表明子模块现在指向进行新的提交。那正是你想要的。只需提交更改并推动它们,您的两个项目应重新同步。

请确保将来对子模块进行更改时,还使用git add .将它们添加到父存储库中(子模块更改时,您会注意到一条dirty消息)