这篇文章上次修改于 2252 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 项目开发的一般流程是先fork项目,然后基于自己fork的项目开发,最后通过提交PR将自己的代码merge到上游。 这里会涉及到两个:上游仓库和自己fork的仓库,它们之间最终通过PR关联起来。 但是,由于Golang特定的GOPATH依赖,导致这种方式针对于Golang项目会有些问题。 # 常见开发流程: 1. 将项目fork自己的账户下; 2. Clone自己fork的项目到本地,并进行开发; 3. 将修改的代码push到自己fork的项目中; 4. 从fork的项目中为自己的代码创建PR; 5. 等这个PR被merge后,自己的代码才能进入上游项目。 举个例子,来演示整个过程。为描述清晰、方便,有如下约定: 上游项目为org/repo fork项目为user/repo 按照常规的Git开发流程,在本地clone的fork项目中直接go build,会存在依赖问题: Fork出来的项目在GOPATH中的路径发生了改变,但是代码中import的路径没有改变,所以没有使用fork项目中的package。 即使构建成功,但是真正使用也不是fork项目中修改的代码 有可能GOPATH中已经存在org/repo,所以按照上面的方式构建,不会提示错误。但是如果在user/repo中修改的代码,是无法生效的。 因为代码中引用的是org/repo的package,不是user/repo中修改过的package。 # Golang依赖的优先级: 1. 当前目录下有vendor,就在当前目录vendor下找 2. 如果当前目录下没有vendor,就在其父目录下找vendor 3. 在系统$GOPATH/src中找 4. 在$GOROOT中找 5. 在$GOROOT/src中找 > 注:上面任何一步中找到了依赖,就不再继续。 # 解决办法 了解了golang依赖解析规则后,我们来个变通办法,更改本地remote地址来达到目的,本地开发中路径仍然采用上有路径,这样不必更改import中的依赖路径 1: 重命名克隆下来的user/repo远端: ``` git remote rename origin fork ``` 2: 添加/org/repo远端作为依赖拉取路径 ``` git remote add official http://xxx.com/org/repo.git ``` 3: 更改本地远端映射关系 ``` git branch --set-upstream-to=official/master ``` 4: 正常开发调试 5:push到自己远端仓库fork ``` git push fork ``` 6: 向org/repo请求pull request 7: 合并pr # 小结 其实,添加多个remote地址的方式适用于任何语言的git项目,能够帮助高效、快捷地在upstream和fork项目中协作。并且结合git rebase能让整个变更历史更加自然清爽,避免过多分叉。
没有评论