本文将介绍如何在 CentOS 7 下搭建最新版本的 Git 服务器以及通过证书验证和口令验证两种方式访问 Git。
一. CentOS 7 安装最新版的 Git服务器
1. 查看 yum 仓库中的 Git 信息
# yum info git
可见yum仓库中的Git的版本是1.8.3.1,但是Git官网上最新的版本已经到了2.17.0目前(可以通过 https://github.com/git/git/releases 查看当前最新的 Git 版本信息)。所以要想安装最新版本的 Git 服务器,只能通过下载源码进行安装。
2. 安装依赖库
# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# yum install gcc perl-ExtUtils-MakeMaker
3. 从 yum 中卸载低版本的 Git
# yum remove git
4. 下载最新版本的 Git 源码
比如想将下载的最新的 Git 源码放在 /usr/local/git 目录下:
① # cd /usr/local
② 在 /usr/local 下创建 git 文件夹:# mkdir git
③ # cd git
④ 下载:
(在线下载)# wget https://github.com/git/git/archive/v2.16.3.tar.gz
(离线下载)有时因为网络的原因,导致在下载到中途的时候连接关闭而无法正常写入 v.2.16.3.tar.gz。这时可以在浏览器中输入 https://github.com/git/git/archive/v2.16.3.tar.gz,先将包下载到本地,然后从本地传到服务器的 /usr/local/git 下。
如果你是 Windows 系统的话,可以直接通过 WinSCP 工具从本地直接拖拽到服务器相应目录;
如果你是 Mac 系统的话,可以通过如下命令(假设离线包下载到了 Downloads 下):
则首先要进入 Downloads:$ cd Downloads
然后 scp v.2.16.3.tar.gz root@x.x.x.x:/usr/local/git
更多 Linux 系统和 Mac 本地文件如何传输,参考:
https://jingyan.baidu.com/article/93f9803f30babee0e46f55eb.html
5. 解压
# tar -xzvf v2.16.3.tar.gz
6. 安装 Git
① # cd git-2.16.3
v2.16.3.tar.gz 解压之后的文件是 git-2.16.3,所以进入 git-2.16.3。
② # make prefix=/usr/local/git all
③ # make prefix=/usr/local/git install
7. 添加到环境变量
① # vim /etc/profile 输入 i 进入编辑模式
② 添加 export PATH="/usr/local/git/bin:$PATH" ,输入 ESC,然后输入 :wq 保存退出。
③ # source /etc/profile 使配置立即生效
8. 查看是否安装成功
# git --version
输出 git version 2.16.3。到现在为止,在 CentOS 7 上最新的 Git 就安装成功了。
9. 设置 git 的默认路径,建立链接
# ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
# ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack
-----------------------------------------------------------------------------
提示:
在 clone 的时候可能会遇到:'bash: git-upload-pack: command not found' 'fatal: The remote end hung up unexpectedly' 的错误,原因是因为在服务器上,Git 的安装路径是 /usr/local/git,不是默认路径,所以需要建立如上链接。当然,如果无法修改 Git 服务器上配置,可以在 clone 时,添加 --upload-pack 选项来指定 Git 服务器上的 git-upload-pack 路径,达到上面相同的目的(eg:git clone --upload-pack "/usr/local/git/bin/git-upload-pack" root@x.x.x.x:/root/code.git)。遇到 git-receive-pack 的错误,同样是因为这个原因,建立链接文件就可以了。
-----------------------------------------------------------------------------
二. 在 Git 服务器上创建用户组和用户
创建组:# groupadd 组名
eg: # groupadd git
创建用户:# useradd 用户名 -g 组名
eg: # useradd git -g git
创建密码: # passwd 用户名
eg:# passwd git
-----------------------------------------------------------------------------
提示:
创建完用户后会在 /home 目录下生成一个以用户名为名的目录,可以通过 -d 设置用户登录的主目录位置(eg:useradd user01 -d /usr/user01 -g git)。如果不想为用户建立目录,可以在建立的时候用 -M 命令;
创建的账户保存在 /etc/passwd 中;
删除用户:# userdel 用户名。如果想连用户目录一块删除的话,可以使用 # userdel -f 用户名。
-----------------------------------------------------------------------------
三. 访问 Git 方式一:通过证书访问
1. 初始化
例如想将仓库建在 /home/git 下
① # cd /home/git
② # git init --bare test.git
如果先 su - g 切换到 git 用户建,默认会建到 git 用户所在的文件夹下。
2. 在 Git 客户端生成公钥
Mac 上 公钥的生成:
$ ssh-keygen -t rsa -C "YourEmal@163.cn"
这时会询问 key 的保存路径和密码,如果这时设置了密码,在进行提交等操作的时候会让输入刚设置的密码。如果不需要设置这些的话,一路回车就可以了。
完成之后会生成两个文件,一个公钥 id_rsa.pub,一个私钥 id_rsa。
默认目录在 /Users/xxx/.ssh,执行 cat .ssh/id_rsa.pub 可以查看生成的公钥的内容。
Windows 上公钥的生成:
ssh-keygen -t rsa
3. 在 Git 服务器上打开 RSA 认证
# vim /etc/ssh/sshd_config
修改里面的内容为:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /home/git/.ssh/authorized_keys #你的authorized_keys所在路径
4. 将客户端生成的公钥添加到 authorized_keys 中
① # cd /home/git/
② # su - git
切换用户为git,保证 .ssh 和 authorized_keys 文件的所有者都是 git。再切换到 root 用户时输入 exit。
③ 新建 .ssh 文件夹并赋权限
# mkdir .ssh
# chmod 700 .ssh
④ 新建 authorized_keys 文件,用来存放客户端的公钥。
# touch .ssh/authorized_keys
# chmod 644 .ssh/authorized_keys
⑤ 添加公钥到 authorized_keys
# vim .ssh/authorized_keys
将客户端生成的公钥内容拷贝到 authorized_keys 里,多个用户多个公钥,每行一个。
5. 客户端 clone 进行验证
git clone git@x.x.x.x:test
clone,push 等操作不需要输入密码。
四. 访问 Git 方式二:通过用户名/密码访问
1. 初始化
例如想将仓库建在 /home/Project
① # cd /home/Project
② # git init --bare test.git
2. 修改 /etc/ssh/sshd_config
# vim /etc/ssh/sshd_config
修改为:
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile /home/git/.ssh/authorized_keys
PermitEmptyPasswords no
PasswordAuthentication yes
3. 新创建一个用户并设置密码
# useradd user01 -g git
# passwd user01
4. 客户端 clone 进行验证
git clone ssh://user01@x.x.x.x/home/Project/test.git
需要输入密码才能进行 clone。
5. 客户端 push 进行验证
进入到本地下载的程序目录,添加一个文件。然后
git add .
git commit -m "init"
git push origin master
-----------------------------------------------------------------------------
提示:
在 push 的时候可能会报 'remote unpack failed: unable to create temporary object directory To ...' 或 'git push error: remote unpack failed' 这类的错,执行 git branch -a 的时候,发现远程分支 master 不存在。因为在 push 的时候,如果远程分支不存在,则会创建远程分支,但是这里没有被创建,很可能的原因就是权限不足。所以进入到 /home/Project,执行 chmod -R 777 /test.git 后,再次 push 就没有问题了。还有另一种原因,参看 http://radzhang.iteye.com/blog/2237283。
-----------------------------------------------------------------------------
五. 禁止 Shell 登录
Git 创建的用户可以通过 ssh 连接到服务器,对服务器安全造成一定影响。所以禁止 Git 用户 shell 登录,只赋予其操作 Git 的相关权限就可以了。
进入 /etc/passwd,将 bash 改为 git-shell
修改:user0001:x:1003:1003::/home/user0001:/bin/bash
为:user0001:x:1003:1003::/home/user0001:/usr/local/git/bin/git-shell
修改后 user0001 可以正常通过 ssh 使用 Git,但是无法 Shell 登录了。当通过 ssh user0001@x.x.x.x 登录时会报:
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
六. Git 相关命令
ls -la #查看仓库的所有者
git remote -v #查看源地址
git remote add origin git@x.x.x.x:test #添加源
git status #查看本地哪些文件没有提交
七. 参考网址
https://blog.csdn.net/permanent_2008/article/details/73839315
https://blog.csdn.net/hahachenchen789/article/details/78927460