强制Git子模块始终保持最新状态

时间:2012-05-04 06:15:21

标签: git git-submodules

我喜欢git子模块。另外,我讨厌git子模块。我喜欢他们的是它如何使你能够干净地划分依赖关系等等。我明白让他们指出一个回购的具体提交,我这样做。但在我的情况下,我正在构建一个将在另一个项目中使用的库,所以我想把它保存在那个单独的回购中。

然而,当我每天在这个库上工作时,烦恼就来了,我不得不使用我的库切换回app来提交指针更新。

那么,当我不断更新并添加到这个库时,是否有可能让git子模块始终位于它指向的repo的头部?

4 个答案:

答案 0 :(得分:38)

正如我在“git submodule tracking latest”中提到的,你可以从git 1.8.2(2013年3月)开始,让子模块跟踪分支的HEAD:

git submodule add -b <branch> <repository> [<path>]

子模块SHA1仍然作为 gitlink special entry in the index

记录在父仓库中

但是git submodule update --remote将更新与SHA1的条目匹配子模块远程仓库的分支的HEAD。

如果您有一个现有的子模块,you can make it follow a branch使用:

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/master master

cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"

答案 1 :(得分:27)

不,这是设计的。如果有一种方法可以将子模块指向某个其他存储库的“当前头”,那么就无法从主存储库中检索历史版本(例如标记版本)。它不知道要检查哪个版本的子模块。

话虽如此,您可能对git subtree脚本感兴趣。这提供了一种不同的子模块处理方式,可能与您的工作流程更兼容。最近post on HN我刚刚提醒过我。

答案 2 :(得分:0)

为什么不在子模块目录中进行更改,子目录本身就是一个git repo?这样,您的应用程序将始终具有更新的库。

注意事项:

  1. 您仍需要在app repo中提交子模块更改,以便将更改置于版本控制中(对于应用程序)。

  2. 如果有多个应用程序而不是使用此库的应用程序,那么这不会起作用,因为在任何给定时间只有一个应用程序是最新的。

答案 3 :(得分:0)

目前没有这样的事情。为了使代码保持最新,我使用以下命令:

首次下载所有内容:git clone --recursive http://github.com/<your repo>
在现有存储库中下载更新:git submodule update --remote --recursive --merge