由于github可以免费帮我们管理项目(即项目的版本控制),因此我们通常会将一些开源项目放在github的公共仓库。
但我们经常会有这样的需求:出于商业目的,我们必须要项目的源文件进行保密。
这个时候再用github的私有仓库管理我们的项目就不合适—github的私有仓库前两天还是“收费”的呀,现在免费了。
这个时候,我们就可以考虑搭建一个私有的Git服务器。
以下是阿里云服务器Linux作为服务器系统,本机Windows作为客户端系统进行示例说明。
命令执行成功后,测试效果应该如下:
Windows通过安装包安装Git在Git官网下载地址,下载最新版本的Git。安装完成后配置Git的环境变量。
Git官方文档里面有说明,谷歌/百度也能搜到很多教程,这里就不再赘述。
如果安装完成并配置好了Git的环境变量,鼠标右击后的菜单栏,可以看到Git Bash Here的选项,选择后即可打开git的命令行工具。
在桌面通过Git Bash Here,打开git的命令行工具,进行如下测试:
# 创建e://test目录,作为本地仓库cd e:mkdir testcd test# 克隆远程仓库git clone git@47.96.86.36:/home/gitrepo/blog.git# 这段命令的含义:以git用户的身份,拉取ip地址为47.96.86.36的主机上目录为/home/gitrepo/blog.git对应远程仓库管理的工作目录。这里要键入的密码就是passwd git命令为git用户设置的密码。命令执行成功后的效果图如下:
由于我们这里刚刚初始化Git仓库blog.git,目前该Git仓库管理的工作目录中没有任何内容,所以克隆到客户端时,工作目录blog中没有任何内容。这里的.git是隐藏目录,里面存放的就是本地仓库对应的工作目录blog的版本信息。
这里需要注意的是:客户端的工作目录下新建文件,通过git push origin master命令推送到远程仓库后,远程仓库是看不到这些文件的。因为远程仓库初始化时设置了参数--bare,表示不会存放源文件,只是存放工作目录的版本信息。
我们每次从远端仓库拉取最新版本的项目,或从本地往远端推送新代码时,都需要验证密码。这样太麻烦了,Git给我们提供了一种方法来解决问题。
客户端生成公钥 # 在客户端生成一对密钥(公钥和私钥)ssh-keygen -t rsa -C "zhenye@netopstec.com"这个命令执行后,会在~/.ssh路径即user/.ssh下生成如下文件,记录里面的公钥文件id_rsa.pub中的内容。效果图如下:
服务器端通过RSA认证实现免密 新建存放公钥的文件 # 创建目录.sshmkdir /home/git/.ssh# 给该目录授予权限700chmod 700 /home/git/.ssh# 创建文件authorized_keystouch /home/git/.ssh/authorized_keys# 给该文件授予权限600chmod 600 /home/git/.ssh/authorized_keys# 由于权限设置问题(只有“文件所有人”才能操作),需要把把“文件所有人”更改为git用户chown -R git:git /home/git/.ssh/说明:git用户的默认根目录是/home/git,公钥默认是放在/home/git/.ssh/authorized_keys文件里面。
这里需要注意的是每行放一个公钥。
因此这里就是将客户端生成的公钥放在该文件authorized_keys中。
此时,在客户端进行push/pull等等操作就都不需要输入密码了。
免密的原理说明:
在客户端执行命令ssh-keygen -t rsa -C "***.com",是通过rsa算法生成了一对密钥(一个公钥和一个密钥),由于这里是根据当前客户端的ip地址、当前时间戳等等信息生成的,保证了数据的唯一性,这也就保证了用户认证的安全性。服务端开启了RSA认证后,把客户端的公钥保存在authorized_keys文件中,也就相当于客户端就是放在服务端的白名单中。每次客户端通过git操作来连接服务端时,就会放行,而不需要密码认证。