如何设置子模块以指向特定提交而不提取它?

时间:2015-11-04 05:52:47

标签: git git-submodules

我正在编写一个服务,用于更新超级项目中每个子模块指向的提交。我这样做的天真方式是在子模块git fetch中运行git reset --hard <hash>,然后添加子模块并提交它。

我想跳过git fetch步骤并简单地强制子模块指向给定的哈希以获得更好的性能(跳过获取对象并占用磁盘空间)并处理上游可能不再存在的提交并且无论如何都无法获取(如果他们被强行推动破坏了)。

1 个答案:

答案 0 :(得分:12)

解决方案是直接写入Git索引,这对子模块来说实际上很简单。使用Git 2:

git update-index --cacheinfo 160000,<Git hash of the submodule's tree>,<path to the submodule>

因此,例如,如果您的项目目录结构如下所示:

.
├── .git
└── submodule

然后更新子模块以指向提交2764a900748fbed7453f5839cb983503cee346d2,您将运行:

git update-index --cacheinfo 160000,2764a900748fbed7453f5839cb983503cee346d1,submodule

最后像往常一样用git commit跟进。