代码同时更新到Gitee和github

由于国内同步到Gitee更方便,国外同步到github更方便,需要把同一套代码同时同步到Gitee和github。把这个过程记录下来。

同时,由于github禁止了用户名和密码来认证,因此,这里对于Gitee和github统一采用ssh认证。注意,选择ssh认证之后,代码库clone的命令的细节会和用https的方式不同。

第一步,生成ssh key公钥和私钥对。可以采用不同的协议。在这里用rsa格式。进入~/.ssh目录下,输入命令:

$ ssh-keygen -t ed22519 -C "YourGIthubEmailbox" -f "github_id_rsa" 

直接两次回车.会在文件夹下生成github_id_rsa和github_id_rsa.pub.Gitee已经不允许rsa编码的公钥,因此,改成ed22519。

第二步,把github_id_rsa.pub的内容添加到github的SSH Keys中,取个名字,保存。

针对Gitee,重复这个过程。

第三步,在~/.ssh文件夹下新建config文件,添加以下内容

# gitee 
 
Host gitee.com 
HostName gitee.com 
PreferredAuthentications publickey 
IdentityFile ~/.ssh/gitee_id_rsa 
 
# github 
 
Host github.com 
HostName github.com 
PreferredAuthentications publickey IdentityFile ~/.ssh/github_id_rsa 

第四步,添加识别 SSH keys 新的私钥。为了让 SSH 识别新的私钥,需要将新的私钥加入到 SSH agent 中

$ ssh-agent bash  
$ ssh-add ~/.ssh/github_id_rsa
$ ssh-add ~/.ssh/gitee_id_rsa

第五步,测试是否连接成功。运行如下命令,看是否受到欢迎信息:

$ ssh -T git@github.com
$ ssh -T git@gitee.com

这样认证方式就设置好了。下面,我们来建立代码库,来使用这个ssh key认证方式和Gitee以及github连接。

第一,建立本地代码库和远程相连。假设Gitee和github都已经建立代码库,test.git。我们需要查看代码库,获取这个代码库的ssh访问地址,例如 git@gitee.com:XXX/test.git。然后把这个地址通过 git clone和git remote add从其中一个远程代码库创建本地代码库,以及把新创建的本地代码库连接到另一个远程代码库。

$ git clone git@gitee.com:XXX/test.git
$ git remote add github git@github.com:XXX/test.git

第二,同步代码库。用git config -e 或者用命令行git remote set-url origin来修改config文件,得到以下的效果(也就是origin下面包含两个远程库的信息,两个远程库分别有自己的名字和信息):

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = git@gitee.com:XXX/test.git
url = git@github.com:XXX/test.git
[branch "master"]
remote = origin
merge = refs/heads/master
[remote "github"]
url = git@github.com:XXX/test.git
fetch = +refs/heads/:refs/remotes/github/
[remote "gitee"]
url = git@gitee.com:XXX/test.git
fetch = +refs/heads/:refs/remotes/gitee/

有了这个状态,就可以通过git add,git commit和git push 来同时把本地库文件push给两个远程库,以及用git pull来从两个远程库pull到本地。如果需要针对独自远程库的push和pull,则用相应的名称,gitee和github就可以。例如

git remote update 同时从两个库拉过来本地;

git pull github master 仅仅从github库拉过来本地;

git push github 仅仅从本地推送到github。

当然,如果只为了同步速度,仅仅使用Gitee也可以,只需要把Gitee的ip地址修改成154.213.2.253。这个地址对于国外用户,会快很多很多。可以通过修改/etc/hosts文件,或者修改ssh下的config文件。

git服务器上已经建立的项目列表和本地目录,ssh端口修改

由于学校控制22端口,所以修改了ssh端口为7712(因此,直接访问机器的命令行需要改为:ssh git.systemsci.org -p 7712)。ssh服务器端修改端口号的办法是:修改/etc/ssh/sshd_config文件,在Port 22下面,添加Port 7712(注意不要去掉22端口,万一去掉7712端口有没有配置好,那你就登录不了这个机器了)。同时在/etc/ssh/ssh_config里面同样的地方也添加Port 7712。

在客户端可以在~/.ssh/下新建一个config文件(如果你是图形界面,则直接修改ssh图形客户端配置就可以),文件内容为:

Host YOUR_HOST
User YOUR_USER_NAME
Port YOUR_NEW_PORT

这一步对于git找到相应的端口非常重要。

这个文档的以下部分记录git服务器,git.systemsci.org上面管理的项目。关于git安装和使用见下文。
如果你已经通过~/.ssh/下新建一个config文件来识别端口号,则下面的命令中的端口号都可以去掉。如果你没有做这一步,则下面的命令中都加上端口号。当然如果是默认22的配置,则不用添加端口号。

  1. IO文档
    1. 服务器端在/home/git/IO.git
    2. 本地保存在Research/Input-Output/下面,跟踪对象是所有的.tex文件。

详细安装过程和使用方法如下:

  1. 在服务器端安装git: sudo apt-get install git-core,并添加git用户(sudo adduser git,注意密码),普通用户不用做这一步
  2. 在服务器端建立一个项目:mkdir IO.git。在这里,整个git目录只用于存储项目。因此,所有的项目直接放在~/git/下面。如果项目还没有在上面的列表上,普通用户需要完成这一步
  3. 在项目目录下面,初始化项目目录结构:git init –bare。这时候指有目录结构,什么具体内容都还没有呢。
  4. 回到本地机器准备加入内容
    1. 生成和上传一个ssh公钥到服务器上(参考如下帖子,需要git用户密码,请跟我联系):

      1. ssh-keygen -t rsa
      2. cat ~/.ssh/id_rsa.pub | ssh git@git.systemsci.org "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
      #这部分完成的事情首先是在本地自己的机器上产生一个id_rsa.pub公钥,然后把这个公钥上传到远程服务器,并且重命名为authorized_keys.

      完成这两步之后试试是否能够免密码访问服务器了。
    2. 已经存在的IO项目目录:把这个目录变成存储项目内容的本地目录(git init )。然后把远程项目拉过来同步到本地目录(git remote add origin ssh://git@git.systemsci.org/home/git/IO.git, git pull origin master)。接着把本地目录的内容加入到需要同步的列表(git add., git commit -m “massage” -a),然后把本地目录的内容推送到远程(git push origin master)
    3. 或者如果还没有这个项目的话,到预期存储IO项目的上一级目录(运行完成下面的目录会产生一个名字叫做IO的子目录)。然后运行:git clone git@git.systemsci.org:/home/git/IO.git,就会把整个服务器上的这个项目的内容完整地复制下来。
    4. 在本机这个项目目录下面编辑文档,并且用git add, commit, push之类的命令同步到服务器上。也可以安装图形客户端。
  5. 注意:最好只把文本文件当作git管理的对象,否则,由于要检查和跟踪变化,git会非常慢