赞
踩
在使用git管理项目的时候,不管是gitlab还是github项目,都可以通过fork将上游仓库的项目复制到自己仓库中,但是上游的仓库变更时,怎么同步更新自己仓库里的变化呢?
一般有两种方式,一种方式是将上游的仓库提merge request到自己的仓库去合并;另一种方式是每次在修改自己仓库复制的项目之前,先通过git pull upstream master去同步上游项目的更新。
git pull origin是拉取自己或团队项目的更新到本地;git pull upstream是拉取fork的外部上游项目的更新到本地自己仓库中的项目中。
origin指的是源仓库,一般为git clone的仓库,如xxx/fastjson,是克隆后默认提交和拉取的仓库地址。
upstream意指上游仓库,一般是fork 出的上游仓库,如alibaba/fastjson。
无论是github还是gitlab都有fork操作,该操作相当于把外部的仓库里面的项目复制到自己仓库下。例如,对alibaba/fastjson项目进行fork,会在自己仓库出现tomcat/fastjson项目,这里的tomcat代指自己github或gitlab的用户名。
git clone ssh://git@github.com/tomcat/fastjson.git
git pull // 默认是 git pull origin master,从bannidaer/fastjson的master分支拉代码
git pull upstream master // 从上游alibaba/fastjson的master分支拉代码
在进行本地fork出的项目修改之前,想要先同步上游的更新,于是进行git pull upstream操作,出现如下问题:
fatal: 'upstream' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.
通过 git remote -v 检查,发现错误原因是 upstream repository 的地址是 ssh协议,而不是 https,并且没有指定upstream上游仓库地址而是自己origin的tomcat仓库。
origin ssh://git@github.com/tomcat/fastjson.git (fetch)
解决方案:
如果想要使用https协议的仓库地址,可以利用 git remote remove upstream ssh://…仓库地址 的方式移除掉原来的 upstream repository,再 git remote add upstream https://… 添加上新的地址。
% git remote add upstream ssh://git@github.com/alibaba/fastjson.git
origin ssh://git@github.com/tomcat/fastjson.git (fetch) // 自己仓库的origin源项目
origin ssh://git@github.com/tomcat/fastjson.git (push)
upstream ssh://git@github.com/alibaba/fastjson.git (fetch) // 外部上游仓库的项目
upstream ssh://git@github.com/alibaba/fastjson.git (push)
添加完上游仓库地址后,再次执行git pull upstream命令如下:
% git pull upstream master
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 764 bytes | 76.00 KiB/s, done.
From ssh://git@github.com/alibaba/fastjson
* branch master -> FETCH_HEAD
* [new branch] master -> upstream/master
Updating xxxxxx
Fast-forward
由于之前配置了GOPRIVATE,项目中引用私有仓库的项目,就将之前https协议拉取代码的方式改成了ssh方式,这里指定ssh协议的上游仓库地址,如果你使用的是https协议可以指定https协议的上游仓库。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。