gpt4 book ai didi

git - 如何在将 vendor 目录 checkin 版本控制时管理 Go 依赖项?

转载 作者:IT王子 更新时间:2023-10-29 00:47:26 26 4
gpt4 key购买 nike

上下文

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

我正在使用 Glide管理依赖关系和锁定特定版本。由于该项目是供其他人使用的库,因此我想将 vendor 文件夹 checkin 版本控制。这样,该库的用户无需安装 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 文件,因此无法正确 checkin 依赖项。我们必须记住在更新或添加新依赖项时执行此操作。

最佳答案

请注意,该问题的原始标题是“如何防止 git 默认使用子模块?”。我更新了标题,因为我想出的解决方案不涉及这样做。据我所知,当您添加的依赖项包含 .git 目录时,没有办法阻止 git 使用子模块。

相反,我决定让 git 将依赖项添加为子模块。子模块确实令人困惑,甚至带有自己独特的命令集。我发现这并不重要。该库的用户将永远不必直接与子模块交互,因为 go get 并且 Go vendor 实验将正常运行。此外,glide getglide install 命令也仍然有效。

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

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

更新:我说得太早了。从头开始安装时,按照我的方式使用子模块(这只是使用默认的 git 行为)似乎会导致 go get 出现问题。在我弄清楚如何让它发挥作用之前,我将取消选择它作为所选答案。

关于git - 如何在将 vendor 目录 checkin 版本控制时管理 Go 依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com