远程仓库是团队公共仓库,一般用于团队协作。远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
远程仓库可以直接使用市面上的远程仓库(基于git的远程仓库有很多,最有名的是github和gitlib),也可以自己搭建一个公共的仓库。
github
gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。github号称是全球最大的同性交友平台哈哈
github官网:https://github.com 使用前请先自行注册github账户。
前面已经在本地创建了一个Git仓库,现在想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,一举多得。
下面介绍远程仓库跟本地仓库关联的方法。如果只是想下载github上别人的代码的话,直接在clone or download
里选择Download ZIP
即可
传输协议
本地Git仓库和GitHub仓库之间需要传输数据,传输数据就需要传输协议,git支持多种传输协议,最常用的就是ssh协议和https协议
使用https协议时每次需要输入口令(github用户名和密码)
使用ssh协议时需要先设置SSH Key。GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
本地Git仓库创建SSH Key
ssh-keygen -t rsa -C "your email"
把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可
创建完后在用户主目录里会有个.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
远程Github仓库关联
登陆GitHub -> 点击右上角用户头像 -> settings -> SSH and GPG Keys -> New SSH key -> 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容 -> Add SSH key
使用ssh协议时,第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
创建远程github仓库并与本地git仓库关联
创建远程github仓库
右上角的+号 -> new repository -> 填写Repository name、Description、Initialize this repository with a README(顺便创建readme文件) -> Create repository
创建完远程仓库后会跳到一个关联页面,列出了远程仓库与本地仓库关联的方法。可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
关联情景1:已有本地库,新创建的远程库与之关联
这种情景一般为项目创建者,本地创建项目,在github上创建一个开源库,团队其他成员就可以克隆此项目。
//将文件提交到本地版本库
git add 要提交的文件
git commit -m '描述'
//关联远程库。以下两种方式都可以,任选一种即可。
//git支持多种协议,包括ssh协议和https协议(默认使用ssh协议)。https协议速度慢,并且需要输入口令(github账户密码),如果没有设置ssh key,可以用https协议。
git remote add origin https://github.com/用户名/项目名.git
git remote add origin git@github.com:用户名/项目名.git
//将本地git仓库master分支推送到远程github仓库master分支。
//第一次推送master分支时,加上了-u参数,表示将本地的master分支推送到origin主机,同时指定origin为默认主机,在以后的推送或者拉取时就可以简化命令,不必加-u参数了。
//origin为远程库的名字,这是Git默认的叫法,也可以改成别的,但没必要
git push -u origin master
刷新github页面,就可以看到本地git仓库的代码已经同步到github仓库里了。
注:若项目是git clone别人的项目,那么要想在github上创建成自己的项目,需要先把项目根目录里的
.git
目录删除(切断与别人项目的连接),重新git init
(初始化)。之后再执行上述命令。
关联情景2:没有本地git仓库,从新创建的远程库克隆到本地仓库
这种情景一般为项目的团队成员克隆项目到本地,进行开发。
//https协议和ssh协议,选择任意一种即可
//项目地址可在 clone or download 里找到
git clone https://github.com/用户名/项目名.git
git clone git@github.com:用户名/项目名.git
这样,就有了一个跟远程github仓库关联的本地仓库了。
自己搭建Git远程仓库
一般情况下,使用GitHub托管代码足以。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费(创建私密仓库),那就只能自己搭建一台Git服务器作为私有远程仓库使用。
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。
搭建步骤
第一步,安装git
sudo apt-get install git
第二步,创建一个git用户,用来运行git服务
sudo adduser git
第三步,创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv目录下输入命令:
sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
sudo chown -R git:git sample.git
第五步,禁用shell登录
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
第六步,克隆远程仓库
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行
git clone git@server:/srv/sample.git
公钥权限管理
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,可以用Gitosis来管理公钥(一般大团队都有自己的管理员)。
管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。可以直接使用Gitolite来管理权限。