git submodule init没有提取最新提交

lev*_*evi 28 git git-submodules

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

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

Ada*_*ruk 37

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."
Run Code Online (Sandbox Code Playgroud)

更短的版本是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 考虑这个“git submodule ilikepancakes”可能同样有意义。如果有人不同意,请阅读有关内核空间 api 设计的明智介绍:http://man7.org/conf/lca2013/Why_kernel_space_sucks-2013-02-01-printable.pdf (2认同)
  • 可爱的宝贝耶稣,这简直要了我的命。泰! (2认同)

Saa*_*aad 11

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

对于git v 1.8.x

git submodule update --init --recursive --remote
Run Code Online (Sandbox Code Playgroud)

对于v1.7.x:

git submodule update --init --recursive 要么 git pull --recurse-submodules

对于v1.6.x

git submodule foreach git pull origin master
Run Code Online (Sandbox Code Playgroud)

检查你的git版本.

git version
Run Code Online (Sandbox Code Playgroud)

  • 前一个为我工作。非常感谢 (2认同)

qqx*_*qqx 10

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

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

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