linux下CentOS7搭建git仓库
1. 安装git
Linux 做为服务器端系统,Windows 作为客户端系统,分别安装 Git
yum install -y git
安装完后,查看版本
git -version
windows下就是一键安装了
2. 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码
创建用户 git
[root@localhost /]# id git # 查看用户
[root@localhost /]# useradd git
[root@localhost /]# passwd git
设置 /home/git/cangku/test
为版本仓库
[root@localhost /]# mkdir /home/git/cangku
[root@localhost git]# chmod -R 777 cangku/
[root@localhost git]# mkdir /home/git/cangku/test
[root@localhost git]# chmod -R 777 /home/git/cangku/test
把 test
初始化为一个git仓库
[root@localhost cangku]# cd test
[root@localhost cangku]# git init --bare // --bare 创建一个裸仓库
由于创建一个git
账户来管理仓库,所以把 Git 仓库的 owner
(属主/属组) 修改为 git
[root@localhost cangku]# chown -R git:git ./test
然后可以 ll 进行查看,然后就可以在windows下进行克隆项目
$ git clone ssh://git@192.168.1.100/home/git/cangku/test #可能需要输入git用户密码
或者
$ git clone ssh://root@192.168.1.100/home/git/cangku/test #此时输入root密码
3.服务器端 Git 打开 RSA 认证
进入 /etc/ssh
目录,编辑 sshd_config
,打开以下三个配置的注释:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
保存并重启 sshd 服务:
[root@localhost ssh]# /etc/rc.d/init.d/sshd restart
或者
service sshd restart
或者
/bin/systemctl restart sshd.service
由 AuthorizedKeysFile
得知公钥的存放路径是.ssh/authorized_keys
,实际上是 $Home/.ssh/authorized_keys
,由于管理 Git 服务的用户是 git
(上面创建的用户git),所以实际存放公钥的路径是/home/git/.ssh/authorized_keys
在 /home/git/ 下创建目录 .ssh
[root@localhost /]# mkdir ~/.ssh
[root@localhost /]# cd ~
[root@localhost /]# ll -a
注意:把 .ssh
的目录权限改成可写入,不然后面导入会提示无权限
[root@localhost git]# chmod -R 777 .ssh
将客户端公钥导入服务器端 /home/git/.ssh/authorized_keys 文件,在 widnows下的桌面中打开 git bash,执行
Administrator@PC-20190319UHLW MINGW64 ~/Desktop
$ ssh git@192.168.1.100 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
git@192.168.1.100's password:
执行完毕,回到服务器端,查看 .ssh 下是否存在 authorized_keys 文件:
[root@localhost git]# cd .ssh
[root@localhost .ssh]# ll
也可以查看下 authorized_keys
是否是客户端生成的公钥
[root@localhost .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDL3bQwEDbwQ+ghkq/BO8rj8AExFWldopPMyWI6NHfVHCzMrHqVcJrLG7RtEDQD+lTDJIXjKF/SoxLfTyLEQrazbbP/JJImo4XJVTt+KGc3z6gw4vQndz0CPmpKzYECx6rmoicYXTp/amX/T9O4TTJUI3de5fY/pwy5stJ3Fm4SlFGic3DSJDiIlRCPECtUheZ3Rxt9bx6CXdaCmu3m5pZbWnOuhV8VhAmPY5kA5eR1iG36nnlMmZZyr50lPN0rGFGFOzJ7FjMCyt6NlCpVqvL+zt2TtCzwtYDv4dQrKCIDBnTisz+Y0R/bj22vosixYij+0WTEzK6Vm81wkw8nkLPh Administrator@PC-20190319UHLW
重点
:更改 .ssh
与 authorized_keys
权限
[root@localhost git]# chmod -R 700 .ssh
[root@localhost git]# cd .ssh
[root@localhost .ssh]# chmod -R 600 authorized_keys
注意:修改 .ssh 目录的权限为 700;修改 .ssh/authorized_keys 文件的权限为 600
4. 禁止 git 用户 ssh 登录服务器
之前在服务器端创建的 git 用户不允许 ssh 登录服务器,编辑 /etc/passwd
,找到:
git:x:502:504::/home/git:/bin/bash
修改为
git:x:502:504::/home/git:/bin/git-shell
此时 git 用户可以正常通过 ssh 使用 git,但无法通过 ssh 登录系统。
5. 设置git钩子(push之后,项目同步)
进入我们的裸仓库的 hooks文件夹,然后新建一个 post-receive 文件。
cd hooks/
vim post-receive
加入如下内容:
#!/bin/bash
git --work-tree=/www/test checkout -f
其中/www/test
为你实际需要同步的站点目录。
然后修改post-receive为可执行文件(其实这就是一个脚本文件)
chmod +x post-receive
post-receive的原理就是,当远程仓库发现有用户执行了push操作,就会执行一个脚本post-receive(钩子)。其实git还提供了很多其它动作的钩子。
注意:同时你还需要修改你的web站点目录的权限,修改所属用户与用户组为git,否则钩子的权限可能会不足而导致执行失败。(你也可以通过添加git用户到相应的用户组来解决问题)
修改所属用户
chown git:git -R /www # 修改所属用户
设置好钩子后,当你本地再次执行push的时候,你会发现你web目录的文件也同步的更新了。