2

所以这里的情况。我有一个带有多个子模块的 git 存储库。顶级目录和所有子模块都包含 Visual Studio 2010 解决方案。

顶级存储库取决于子模块是否是最新的,并且每次更新子模块时都需要重新构建它们。我想做的是,因为有任意数量的子模块,所以在 git 中制作某种更新后挂钩来编译刚刚更新的子模块。

所以我的问题是:更新子模块时会调用哪些钩子(如果有)?似乎结帐后可能是我想要的,但我不确定。

我们使用 TortoiseGit 和 Git for Windows(msysgit) 作为后端,如果这有所作为的话。

4

1 回答 1

1

post-update hook这应该可以工作,作为repo
您需要监视.gitmodules文件是否有任何更改,以便检测该文件中的任何更改(表明您的父 repo 的另一个克隆已更改子模块并提交了新的引用父回购)。
那么你就可以:

  • 检测哪些子模块发生了变化
  • 决定是否要更新子模块 ( git submodule update --recursive)
  • 重新编译相关子模块

但这假设已修改父 repo 的克隆以引用子模块的新提交。

如果您的子模块独立于任何父 repo 进行更新,那么在post-update父 repo 的结帐/更新时,相同的钩子(仍在父 repo 上)需要:

  • 进入每个子模块并执行提取
  • 检查 fetch 是否引入了任何新的提交
  • 决定是否要更新子模块,这次是通过从子模块中提取更改
  • 返回父 repo 并提交,以注册更改子模块的新 SHA1
  • 重新编译需要的那些git pull(即已经改变的)

您可以在每个子模块上设置更新后挂钩,但是当您从父仓库添加或删除子模块时,上述方法可以更好地扩展,因为它将检测过程集中在一个地方(post-update父仓库的挂钩)。

于 2011-05-01T12:05:06.480 回答