如何在将供应商目录检入版本控制时管理Go依赖项?

时间:2015-12-15 03:02:01

标签: git go git-submodules

上下文

我编写了一个Go库,希望锁定并提供第三方依赖项。这样,对这些第三方依赖项的任何向后兼容的更改都不会破坏我的库以供其他用户使用。有关如何运作的其他背景信息,请参阅Go 1.5 Vendoring Experiment的原始提案。

我使用Glide来管理依赖项和锁定特定版本。由于该项目是供其他人使用的库,我想将供应商文件夹检查为版本控制。这样,库的用户没有安装Glide才能使用它。他们所要做的就是设置环境变量GO15VENDOREXPERIMENT=1

过去我曾使用过Glide,我对它很满意。但是,我之前从未尝试过将vendor文件夹提交给版本控制。这就是为什么我突然遇到问题。我不相信这是Glide需要解决的问题,否则我会在那里打开一个问题。真的,这让我觉得git是个问题。

问题

我正在使用git版本2.5.4。当我运行glide install时,所有依赖项都被克隆并存储在vendor文件夹中。当我尝试将vendor文件夹添加到git时,它会混淆地尝试为它们创建子模块。 (我认为这与每个依赖项都是一个克隆的repo并且仍然有一个.git文件这一事实有关)。这不是我想要的行为,我很惊讶git默认这样做。事实上,我花了一段时间才弄清楚实际发生了什么以及为什么没有正确添加依赖项。

Git子模块令人困惑并打破了很多工具。我只想将销售的项目添加到版本控制中。我希望所有的源代码都在那里,所以它不会搞砸任何其他工具,并且会以我想要的方式工作。

问题

有没有办法在git中关闭此默认行为?理想情况下,它可以基于每个项目。我能找到的唯一相关options for .gitconfig似乎与git diff中的子模块显示或使用git fetchpullclone递归获取子模块。

如果没有,有没有办法在不使用子模块的情况下一次性添加vendor文件夹中的文件和文件夹?我希望有类似git add --no-submodules vendor的东西,但我找不到这样的东西。

我意识到我可以简单地删除每个依赖项中的.git文件,但由于多种原因,该解决方案并不理想。首先,我或其他贡献者可能很容易忘记删除.git文件,因此不会正确检查依赖项。我们必须记住在我们更新或添加新依赖项时随时执行此操作。

1 个答案:

答案 0 :(得分:1)

请注意,此问题的原始标题为"默认情况下如何防止git使用子模块?"。我更新了标题,因为我提出的解决方案并不涉及这样做。据我所知,当您添加的依赖项包含.git目录时,无法阻止git使用子模块。

相反,我决定让git将依赖项添加为子模块。子模块无疑是令人困惑的,甚至还有自己独特的命令集。我发现的是它并不重要。该库的用户永远不必直接与子模块交互,因为go get和Go供应商实验将正常工作。此外,glide getglide install命令仍然有效。

总而言之,我决定坚持使用子模块,但我不能直接使用子模块命令。

您可能还有兴趣查看version 0.14.1 of Zoom的发行说明,其中我实现了此更改并提供了一些其他上下文。 Glide issue #112还提供了有关该问题的更多信息。

更新:我说得太早了。似乎使用子模块的方式(只使用默认的git行为)从头开始安装时会导致go get出现问题。我取消选择这个作为选择的答案,直到我能弄明白如何使其发挥作用。