【问题标题】:How to get another branch instead of default branch with go get如何使用 go get 获取另一个分支而不是默认分支
【发布时间】:2017-08-03 08:41:30
【问题描述】:

我有 2 个存储库。假设他们是 repo_a 和 repo_b。我在 repo_b 中导入了 repo_a

当我运行 go get 时,它会得到 repo_a master 分支。 有没有办法使用 go get 或 repo_b 中的其他命令获取开发分支?

我不想对每个特定的包进行 git pull(在本例中为 repo_a)

【问题讨论】:

标签: git github go


【解决方案1】:

从 Go 1.11 开始,当使用 Go modules 时,这是可能的。在为 Go 模块安装依赖项时,您可以指定 module query,其中可能包含分支或标记名称:

$ go get <path-to-repo>@<branch>

【讨论】:

  • 使用 go 1.13 时,您在尝试获取分支时可能会遇到错误,错误以“无效版本:未知修订 XXX”结尾。您可以通过使用提交哈希而不是分支名称来解决此问题。
  • Only if your branch name contains a slash,那么你会在 Go 1.13 上得到一个错误。解决方法是使用提交 SHA1 而不是分支名称。
  • 如果提交在主分支之外,@ 在 gerrit 中不起作用。
【解决方案2】:

稳定的 HEAD 理念

go get是不可能的。

Go 采用了所有包管理器中最简单、最实用的方法。 Go 包不存在多个版本。

但这并没有第一眼看上去那么糟糕,因为这种行为背后存在一种哲学。

作为包作者,你必须坚持稳定的 HEAD 理念。您的默认分支必须始终是您的软件包的稳定发布版本。您必须在功能分支中工作,并且只有在准备好发布时才合并。

这种方法是受go get 限制所强制,应该像 Python 缩进一样对待 - 这是一种语言设计所强制的哲学。

发展途径

如果你想分叉一些东西或尝试新功能,你可以克隆 repo,然后切换到所需的分支并执行go build。这种方式不应该投入生产。

git clone <repo name>
cd <repo name>
git checkout <branch name>
go build

您还可以使用第三方包管理工具。但是它们中的大多数都支持标签和修订,而不是分支(因为暗示您不需要安装功能分支)。

gpm:

您可以使用格式指定包,其中版本可以是修订号(git/bazaar/mercurial/svn 修订哈希)或标签。

【讨论】:

  • 根据their versioning doc 的说法,为了回应“它们中的大多数支持标签和修订,而不是分支”,似乎支持分支的一个是 Glide。
【解决方案3】:

你可以使用gopkg.in,它会重定向到github。

支持两种 URL 模式:

gopkg.in/pkg.v3      → github.com/go-pkg/pkg (branch/tag v3, v3.N, or v3.N.M)
gopkg.in/user/pkg.v3 → github.com/user/pkg   (branch/tag v3, v3.N, or v3.N.M)

go get gopkg.in/pkg.v3 表示go get github.com/go-pkg/pkg,但是是分支或标签v3.*

详情请见here

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2020-05-26
    • 2023-03-14
    • 2021-10-20
    • 2011-06-05
    相关资源
    最近更新 更多