我有一个 git repo,里面有一个 git 子模块。子模块托管在 bitbucket 上。我想将子模块的本地副本更新为其最新提交。我厌倦了“ git submodule update ”,但这并没有做任何事情。所以我尝试删除子模块文件夹,然后执行“ git submodule init ”但是它只是拉动初始子模块提交,而不是最新的。
如何让我的本地子模块更新到最新的提交?
我有一个 git repo,里面有一个 git 子模块。子模块托管在 bitbucket 上。我想将子模块的本地副本更新为其最新提交。我厌倦了“ git submodule update ”,但这并没有做任何事情。所以我尝试删除子模块文件夹,然后执行“ git submodule init ”但是它只是拉动初始子模块提交,而不是最新的。
如何让我的本地子模块更新到最新的提交?
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
“更新”这个词不是这个子模块命令的最佳选择。这实际上意味着“将子模块指向父仓库的提交所期望的提交”。
将子模块更新为不同的提交(不必是最新的)需要您 cd 进入该目录,像常规 git repo 一样操作它,以便当前提交是您想要的,然后返回并提交此更改顶级回购。
添加子模块后,只需尝试以下命令。
对于 git v 1.8.x
git submodule update --init --recursive --remote
对于 v1.7.x:
git submodule update --init --recursive
或者git pull --recurse-submodules
对于 v1.6.x
git submodule foreach git pull origin master
检查您的 git 版本。
git version
每个包含子模块的 git 提交都与子模块存储库中的特定提交相关联。
提供该git submodule update
命令以将子模块的签出版本更新为为父存储库的当前版本记录的提交。这实际上可能是比您当前在该子模块中签出的版本更旧的版本,例如,如果您正在检查使用旧版本子模块的父存储库的旧版本。
要获得更新版本的子模块,请切换到该目录并像任何其他 git 存储库一样对其进行更新(例如,从上游存储库中提取)。如果您进行任何新的提交或从与您用作子模块源的存储库不同的存储库中提取,请确保将您的更改推送出去。完成此操作后,您可以返回父存储库并将更改提交到子模块,以记录您现在在当前版本和未来版本中用于子模块的新子模块提交,直到您进行另一次更新。
这里有点违反直觉的问题(或者至少对我来说是这样):如果您的主存储库的最新版本与您的子模块不同步,那么当您尝试通过git submodule update
从内部运行“更新”子模块时主存储库,它只会拉到在父模块中指定的最新更改,而不是在子模块中。
换句话说,您的父项目可能指向您的子模块的错误提交。为确保您的父级指向最新的子模块提交(这是我想要的),导航到子模块并运行git pull
,然后返回父级并运行git add .
接下来,如果您运行该git diff
命令,您会注意到虽然主存储库中的所有文件都没有更改,但您会收到一条dirty
消息,显示子模块现在指向一个新的提交。那就是你想要的。只需提交更改并推送它们,您的两个项目应该会重新同步。
确保将来,如果您对子模块进行更改,您还将使用它们将它们添加到父存储库git add .
(当子模块更改时您会注意到一条dirty
消息)。