76

我喜欢 git 子模块。另外,我讨厌 git 子模块。我喜欢它们的是它如何使您能够清晰地划分依赖关系等。我明白让它们指向回购上的特定提交的意义,我确实这样做了。但就我而言,我正在构建一个将在另一个项目中使用的库,所以我想将它保存在那个单独的仓库中。

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

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

4

4 回答 4

67

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

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

子模块 SHA1 仍然作为gitlink记录在父 repo 中(索引中的特殊条目

但是 agit submodule update --remote会将该条目更新为与子模块远程 repo 分支的 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/master master

cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
于 2015-08-06T09:23:01.190 回答
35

更新:从 git 1.8.2 开始,似乎有一个解决方案。请在下面查看 VonC 的答案。原始答案留给 git < 1.8.2 的用户。


不,这是设计使然。如果有办法将子模块指向其他存储库的“当前头”,那么就不可能从主存储库检索历史版本(例如标记版本)。它不知道要签出哪个版本的子模块。

话虽如此,您可能对git subtree脚本感兴趣。这提供了一种处理子模块的不同方式,可能与您的工作流程更兼容。最近关于 HN的帖子让我想起了这一点。

于 2012-05-04T06:16:43.123 回答
0

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

注意事项:

  1. 您仍然需要在应用程序仓库中提交子模块更改,以将更改放入版本控制(针对应用程序)。

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

于 2012-05-04T06:34:01.067 回答
0

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

首次下载全部:git clone --recursive http://github.com/<your repo>
在现有仓库中下载更新:git submodule update --remote --recursive --merge

于 2020-11-06T09:16:51.243 回答