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

Ben*_*Ben 54 git git-submodules

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

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

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

Von*_*onC 41

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

git submodule add -b <branch> <repository> [<path>]
Run Code Online (Sandbox Code Playgroud)

子模块SHA1仍作为gitlink(索引中的特殊条目)记录在父存储库中

但是a git submodule update --remote会更新SHA1的条目,该条目匹配子模块远程仓库的分支的HEAD.

如果您有一个现有的子模块,您可以使用以下分支:

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

  • @VonC 是否有任何计划或讨论让“gitlink”始终指向分支的 HEAD 而不是 SHA1,或者是一个选项,最好在“.gitmodules”中,这样​​“git status”就不会担心“ (新提交)`?`update --remote` 更新它很好,但如果我们可以选择不需要在主分支中提交更新子模块 gitlinks,那就更好了。 (3认同)
  • 每次我运行“git submodule update --remote”时,子模块都会返回到提交并丢失 HEAD 引用 (2认同)

Gre*_*ill 27

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

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

  • 是的,我知道,我所说的是我希望我的父代仓库只要在子模块中本地提交更改时自动更新子模块指针.如果我有一个具有子模块X的项目A,当我在处理项目A时进入子模块X时,我经常要做2次提交,一次在子模块中,然后再在父模型中.如果你正在研究一个变化不大的子模块,但是当你不断地来回走动时,它会变得非常烦人......似乎我应该能够让我的本地回购只提交两者 (2认同)
  • 我想你可以编写一个在提交子模块时使用的脚本,它会自动在父模块中进行相应的提交.或者,您可以编写一个在父模块工作目录中运行的脚本,该脚本会自动提交自上次父项目提交以来已更新的任何子模块的提交. (2认同)
  • 从Git 1.8.2(2013年3月)开始,这已不再适用.https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt.Git为子模块添加了一个功能,指向远程分支的尖端. (2认同)