我喜欢使用git子模块,但也讨厌它们。我喜欢的是它能够帮助你清晰地划分依赖关系等内容。我理解让它们指向仓库上特定的提交点的意义。但在我的情况下,我正在构建一个将用于另一个项目的库,因此我希望将其保留在单独的仓库中。
然而,当我每天都在这个库上工作并且不断更新时,我必须不断切换到使用此库的应用程序以提交指针更新,这就很麻烦。
那么,在我不断更新和添加到此库时,是否可能让git子模块始终处于其所指向仓库的最新状态?
我喜欢使用git子模块,但也讨厌它们。我喜欢的是它能够帮助你清晰地划分依赖关系等内容。我理解让它们指向仓库上特定的提交点的意义。但在我的情况下,我正在构建一个将用于另一个项目的库,因此我希望将其保留在单独的仓库中。
然而,当我每天都在这个库上工作并且不断更新时,我必须不断切换到使用此库的应用程序以提交指针更新,这就很麻烦。
那么,在我不断更新和添加到此库时,是否可能让git子模块始终处于其所指向仓库的最新状态?
如我在 "git submodule tracking latest" 中提到的那样,自从 git 1.8.2(2013年3月)起,您可以使子模块跟踪分支的 HEAD:
git submodule add -b <branch> <repository> [<path>]
一个子模块 SHA1 仍然作为gitlink(索引中的特殊条目)记录在父存储库中。
但是,git submodule update --remote
将更新该条目以匹配子模块远程存储库分支 HEAD 的 SHA1。
如果您有现有的子模块,您可以使用以下方法使其跟随一个分支:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
cd path/to/your/submodule
git checkout -b <branch> --track origin/<branch>
# if the master branch already exist:
git branch -u origin/<branch> <branch>
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking <branch>"
git submodule update --remote
命令时,子模块都会回到之前的提交并且失去 HEAD 引用。 - Idemaxgit submodule update --remote --recursive
是唯一必要的命令。检查你的 .gitmodules 文件以查看哪个/哪些子模块正在跟随分支。 - VonCgitlink
始终指向分支的HEAD而不是SHA1的计划或讨论,或者在.gitmodules
中最好有一个选项,这样git status
就不会担心(new commits)
了?虽然update --remote
更新它很好,但如果我们有选择不需要在主分支上提交子模块gitlinks的提交,那就更好了。 - Partly Cloudy更新:截至git 1.8.2,似乎已经有解决方案。请参见VonC在下面的答案。原始答案保留给git < 1.8.2的用户。
目前还没有这样的东西。为了保持代码最新,我使用以下命令:
第一次下载全部:git clone --recursive http://github.com/<your repo>
更新现有存储库中的更新:git submodule update --remote --recursive --merge