centos搭建私有git库

1. 服务器环境搭建

1.1 安装git

1
yum install -y git

1.2 创建blog用户用于git

1
2
3
adduser blog
chmod 740 /etc/sudoers
vim /etc/sudoers

找到以下内容

1
2
## Allow root to run any commands anywhere
root    ALL=(ALL)     ALL

添加一行 blog ALL=(ALL) ALL 保存退出后将sudoers改回权限

1
chmod 400 /etc/sudoers

设置blog用户密码

1
passwd blog

按照提示输入两次相同的密码即可

1.3 Git服务器打开RSA认证

在Git服务器上首先需要将/etc/ssh/sshd_config中将RSA认证打开,即:

1
vim /etc/ssh/sshd_config
1
2
3
RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys

添加两行配置彻底去掉核对公钥提示:

1
2
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

重启sshd服务

1
systemctl restart sshd

这里我们可以看到公钥存放在.ssh/authorized_keys文件中。所以我们在/home/blog下创建.ssh目录,并创建authorized_keys文件 切换到/home/blog文件夹,创建.ssh文件夹和.ssh/authorized_keys文件

1
2
3
cd /home/blog
mkdir .ssh
touch .ssh/authorized_keys

1.4 SSh Key 设置

按下列步骤在电脑上生成公钥文件id_rsa.pub 在电脑上打开Xshell,点击菜单栏中的"tools",选择“User Key Generation Wizard…”(新建用户密钥生成向导), 弹出“弹出用户密钥生成向导”对话框,在“密钥类型”项选择“RSA”公钥加密算法,“密钥长度”选择为“2048”位密钥长度,(默认就行) 继续下一步,在“密钥名称”中输入Key的文件名称,这里可设置为“id_rsa”, 在“密码”处输入一个密码用于加密私钥,并再次输入密码确认,(会有一个默认的密钥名称,可修改), 点击“下一步”,密钥生成完毕(公钥格式选择SSH2-OpenSSH格式),这里显示的是公钥, 我们可以复制公钥然后再保存,也可以直接保存公钥到文件,这里保存为"id_rsa.pub"文件, 私钥这里不显示,可以在“用户密钥管理…”导出到文件:一般存在电脑的文档文件夹 将客户端上的公钥文件id_rsa.pub里的内容复制到服务器上的authorized_keys文件中

公钥和私钥文件权限设置 SSH对公钥、私钥的权限和所有权的要求是非常严格的,总结如下: 1.下列目录或文件的所有权必须是blog,所属组也应该是blog /home/blog /home/blog/.ssh /home/blog/.ssh/id_rsa /home/blog/.ssh/authorized_keys

1
chown blog:blog /home/blog -R

2.服务器下面文件的权限 /home/blog/.ssh/authorized_keys (644,600) /home/blog/.ssh/id_rsa(600) /home/blog/.ssh (700)

1
2
chmod 600 /home/blog/.ssh -R
chmod 700 /home/blog/.ssh

1.5 禁用git用户的shell登陆

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。

1
vim /etc/passwd

找到类似下面的一行: blog❌1001:1001::/home/blog:/bin/bash 最后一个冒号后改为: blog❌1001:1001::/home/blog:/usr/bin/git-shell 这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。 还要复制一个名为git-shell-commands的目录,避免git shell 报错:

1
2
3
$ cp /usr/share/doc/git-1.8.3.1/contrib/git-shell-commands /home/blog -R
$ chmod +x /home/blog/git-shell-commands/help
$ chmod +x /home/blog/git-shell-commands/list

1.6 测试

若客户端.ssh文件夹下没有known_hosts文件,执行下列命令获取

1
ssh-copy-id -i ~/.ssh/id_rsa.pub blog@SERVER

执行ssh 命令测试是否可以免密登录

1
ssh -v blog@SERVER

若连接成功,则表示git环境已经搭建完成 若连接失败,则需要找到具体原因修复

2. 服务器环境搭建私有git仓库

创建一个裸仓库,裸仓库就是只保存git信息的Repository 一定要加 –bare,这样才是一个裸库。

1
2
cd /home/blog
git init --bare blog.git

使用 git-hooks 同步网站根目录/path/to/www 使用的是 post-receive这个钩子,当git有收发的时候就会调用这个钩子。 在 /home/blog/blog.git 裸库的 hooks文件夹中,新建post-receive文件。

1
vim blog.git/hooks/post-receive

在文件中输入以下信息

1
git --work-tree=/path/to/www --git-dir=/home/blog/blog.git checkout -f

赋予post-receive执行权限

1
chmod +x blog.git/hooks/post-receive

确保git用户blog拥有仓库所有权以及目标文件夹所有权

1
2
chown -R blog:blog /home/blog/blog.git
chown -R blog:blog /path/to/www

执行git clone 命令测试是否可以clnoe

1
git clone blog@SERVER:/home/blog/blog.git

3.客户端环境建立git库及同步

第一次使用git需要配置

1
2
git config user.email "email@email"
git config user.name "userid"

客户端建立git库,并且添加远程仓库

1
2
3
4
5
git init blog
git add .
git commit -m "初次提交"
git remote add blog ssh://blog@SERVER:PORT/home/blog/blog.git   //添加远程仓库还没有提交过,所以要先提交一次. 注意ssh后面有://
git push blog master   //提交到主干

git remote add <分支名> <远程地址> //上面的blog 就是分支,这个可以随便自定义 如果git remote add 加错了,可以使用 git remote rm <分支名> 来删掉:

1
git remote rm blog

若push时发生文件冲突,可先将远程文件拉下来,再push

1
2
git pull blog master
git push blog master

或者强制更新

1
git push -f blog master

如果服务器上已经有项目,快速git到本地

1
2
//ssh协议,后面是 用户@地址:端口/目录
git clone ssh://blog@SERVER:PORT/home/blog/blog.git