linux搭建git仓库的 完美攻略
“好!我们开始建私有仓库。唉?github私库要钱?”
“没事还有gitlab,emmmmm,骄傲的中国程序员不考虑。”
“决定了,码云!就是你了!”
“慢着!你的领导决定要建自己的git仓库,在自己的服务器上。”
“......”
准备
linux系统(centos或者ubuntu) 略,
下载并安装git 略
安装ssh(一般系统默认已安装) 略
学习ssh公钥登录知识 略
步骤一、创建git用户(非指github用户)
1、添加用户名叫git: adduser -m git
2、添加git用户的密码:passwd gitpass
3、如果你添加用户名的时候没有加上-m指令,可能就没有该账户的主目录需要自己生成一个。
# mkdir -p /home/git
# cd /home
# chown -R git:git git
说明:给仓库添加用户是必要的过程,但添加密码并不是,如果添加密码将会有更多的设置步骤,这也是本教程使用的方式。
步骤二、ssh免密设置
实际上就是ssh公钥登录设置。在这里要理解你有两个主机,一个是我们现在要搭建git仓库的主机我们叫服务端,一个是你要使用git仓库上传下拉代码的主机我们叫客户端。
1、公钥登录设置的第一步就是要在客户端生成RSA密钥对,如果之前使用过github这些远程仓库可能就生成过密钥对,直接跳过此步骤。如果没有就使用ssh-keygen -t rsa命令生成密钥对。
密钥对默认生成在root账户目录下的.ssh目录下,windows可以在c/用户/administrator/.ssh/下查找。打开id_rsa.pb,这里的字符串就是公钥串。
生成密钥对的时候会提醒你设置密码,一定一定不要设置密码,一路回车就行。
2、把公钥串添加到服务端git用户主目录下/home/git/.ssh/authorized_keys,这个文件里尾部换行粘贴这个公钥串就行。如果没有对应的文件和目录,创建即可,创建之后为了保险起见添加命令chown -R git:git /home/git
也可以在客户端执行ssh git@119.2.222.222 ' cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
这里的119.2.222.222 是服务器ip,要灵活理解。
同时服务端要修改.ssh和authorized_keys权限(如果不修改,拉代码的时候可能会报权限错误)
chmod 755 /home/git/.ssh
chmod 644 /home/git/.ssh/authorized_keys
3、配置ssh的配置文件sshd_config,一般在/etc/ssh/sshd_config,执行vim /etc/ssh/sshd_config。这里的配置有许多的坑,一般你的centos版本在7.4以下,按照一下配置。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
但是如果你的是新版本的centos就不要这么干,在原有的默认的配置基础下用以下配置
StrictModes no
然后就没了,注意#不代表注释,#加空格表示注释,#不加空格表示默认配置。
4、禁止shell登录。这个很重要,一定一定要配置,不然你登录还是要输入密码(吓你的,嘿嘿)。
修改这个文件,执行命令vim /etc/passwd
git:x:1001:1001:,,,:/home/git:/bin/bash
改为
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
步骤三、新建git仓库
1、选一个目录作为 Git 仓库,将目录所有者改为 git 用户。或者直接使用git主目录。修改目录用户的命令如下。
# chown -R git:git /home/git/test.git
2、创建仓库
# cd /home/git/test.git 进入文件夹,
# git init --bare 创建裸库(这里需要注意--bare参数,表示是要生成一个"干净"的仓库)
3、修改权限
# chown -R git:git test.git
# chmod -R 775 test.git
# chmod g+s -R test.git
步骤四、服务器代码自动更新
当你趟过了免密这个奇坑,恭喜跳进了另一个坑,线上代码自动更新!想想你辛辛苦苦搭建git仓库是为了什么?就为了上传下拉代码?不!我希望我本地修改的代码传到仓库后,线上的代码就能立即更新!
其实这就是Git Hooks自动部署,步骤如下:
1、进入刚刚我们创建过的仓库test.git目录下,再进入hooks目录中
# cd /home/git/test.git/hooks
# touch post-receive 创建名叫post-receive的shell脚本文件
2、shell编写
# vim post-reveive 打开编辑该脚本
#!/bin/sh
unset GIT_DIR
DeployPath="/web/test"
cd $DeployPath
git pull
exit 0
其中/web/test是你的线上项目的路径
3、最后一定要给你的项目目录比如/web切换权限
# chown -R git:git /web/
可能的错误处理
你可能遇到许多错误提示,请耐心的去寻找答案,这里我只介绍一个使用查询日志调试错误的方法。ssh验证相关的日志可以在/var/log/secure里去查找,相关命令可以是cat也可以是tail,vim也可以。/var/log/目录下有系统里的各种日志!
关于项目开发代码管理的方案
在真实的开发环境中我们不应该使用线上线下代码同步的方式,这样的方式适合测试或者UAT服务器。所以我们应该使用UAT服务器作为git仓库与开发客户端同步,线上服务器只pull操作。