【发布时间】:2016-05-08 22:57:07
【问题描述】:
我是一名经验丰富的 Go 开发人员和 Git 用户,但有些事情我似乎无法理解。
通常我的团队使用.gitmodules 来表示包依赖关系,这是一个成功的模式,因为它指向一个精确的提交。整个“卖货问题”就这样为我们解决了。
但是,我最近创建了一个项目并使用 go get 从 GitHub 获取各种包,而不是使用 git submodule add。我完成了项目,将所有内容都提交到了我的 git repo,但是当一个队友克隆出 repo 时,依赖项的源代码丢失了。
通常我会说“哦,你忘了运行git submodule update --init”,但它们当然不是子模块。所以...我可以告诉他运行go get -u 或其他东西(对吗?)但这意味着我受依赖的主分支的支配——进入供应商。
我真正的问题是:当我go get 一个包然后将其提交到我的存储库时,实际上会发生什么?它没有提交到我的源代码树中,也不是子模块......我不知道它到底是什么! go get 和 Git 在这里的行为和交互的确切方式是什么?
奖金回合:您为什么想要这种行为?在什么情况下,您希望将另一个项目提交到您的 repo 中,以强制新签出每次都提取最新版本的源代码?
【问题讨论】:
-
按照golang.org/doc/code.html#remote -
go get <package-path>将包保存到$GOPATH/src/<packagepath>- 即像全局 PYTHONPATH 一样的全局 GOPATH。当然,vendoring 解决了这个问题,并明确地将依赖项(及其版本)与项目捆绑在一起。 -
您可以将 go vendoring 与子模块一起使用。 Golang 团队在 1.6 中修复了这个问题。这是他们的测试用例作为示例 github.com/rsc/go-get-issue-12612
go get将检查 repo 及其所有子模块作为供应商包
标签: git go git-submodules