在Go中使用分叉包导入
假设您在github.com/someone/repo
有一个存储库, github.com/someone/repo
其github.com/you/repo
到github.com/you/repo
。 你想使用你的叉子,而不是主要的回购,所以你做一个
go get github.com/you/repo
现在,这个repo中的所有导入path都将被“破坏”,也就是说,如果存储库中有多个通过绝对URL相互引用的包,它们将引用源代码,而不是fork。
有没有更好的方法将其手动克隆到正确的path?
git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo
处理拉请求
- 将一个存储库:github.com/someone/repo分发到github.com/you/repo
- 得到原始的代码:
go get github.com/someone/repo
- 添加远程您的回购:
git remote add myfork https://github.com/you/repo.git
- 推动你的改变:
git push myfork
http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html
在你的项目中使用一个包
解决这个问题的方法之一就是Ivan Rave和http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html – 分叉的方式。
另一个是解决golang的行为。 当你go get
, golang会使用与存储库URI中相同的名称来设置你的目录,这是麻烦开始的地方。
相反,如果你发出你自己的git clone
,你可以将你的版本库克隆到你的文件系统上一个以原始版本库命名的path上。
假设原始库位于github.com/awsome-org/tool
并将其github.com/awesome-you/tool
到github.com/awesome-you/tool
,您可以:
cd $GOPATH mkdir -p {src,bin,pkg} mkdir -p src/github.com/awesome-org/ cd src/github.com/awesome-org/ git clone git@github.com:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git cd tool/ go get ./...
golang非常乐意继续使用这个仓库,并且实际上并不关心一些上层目录的名字awesome-org
而git远程是awesome-you
。 所有的awesome-org
导入都是通过你刚刚创build的目录来解决的,这是你的本地工作集。
在更多的长度,请参阅我的博客文章: 在GitHub上分叉Golang存储库和pipe理导入path
编辑 :固定的目录path
如果你的fork只是临时的(即你打算将它合并),那么就直接在你的开发环境中进行开发,例如$GOPATH/src/launchpad.net/goamz
。
然后使用版本控制系统的function(例如git remote
)将上游存储库作为存储库而不是原始存储库。
这使得其他人更难以使用你的仓库,但更容易上游集成。
事实上,我在lp:~nick-craig-wood/goamz/goamz
有一个goamz的存储库lp:~nick-craig-wood/goamz/goamz
〜nick lp:~nick-craig-wood/goamz/goamz
,我正是这样开发的。 也许作者会合并一天!
对此的答案是,如果您用多个包分叉repo,则需要重命名所有相关的导入path。 这是很好的事情,因为你分叉了所有这些包,导入path应该反映这一点。
这是一个适用于所有人的方法:
使用github来fork到我的/ repo
go get github.com/my/repo cd ~/go/src/github.com/my/repo git branch enhancement rm -rf . go get github.com/golang/tools/cmd/gomvpkg/… gomvpkg <<oldrepo>> ~/go/src/github.com/my/repo git commit
使代码更好
git commit git checkout enhancement git cherry-pick <<commit_id>>
(“我的/ repo”是一个占位符)
为什么? 这让你有你的回购,任何“去拿”与合作。 它还可以让您维护和增强适合合并请求的分支。 它不会与“供应商”膨胀git,它保留了历史,并且构build工具可以理解它。
为了使这个过程自动化,我写了一个小脚本。 你可以在我的博客上find更多的细节,在你的bash中添加一个像“gofork”这样的命令。