CentOS 6.7 搭建 git 服务器


在一个 Team 中,协同工作是提高工作效率的一大方法,特别是对于代码管理来说。如果公司没有一个代码管理仓库(当然可能性极小…),又或者比较老旧的公司还在使用 SVN 这种古董级代码管理工具。那么你们就很有必要搭建一个私有的 git 代码管理的服务来托管代码。因为他即方便又好用,而且功能强大。下面介绍在 CentOS 6.7 上搭建 git server 的过程,以及相关的配置和简单代码提交操作。

一、操作环境


CentOS 6.7_x64
Windows 10
git-server 1.8.3.1
git-win-client 2.13.3
eclipse 4.7

二、安装 Git Server


1 查看是否已安装 Git

(1) root 用户执行如下命令查看服务器下是已经安装 Git:

[root@blnbpap01 ~]# rpm -qa|grep git-
git-1.8.3.1-6.el7_2.1.x86_64

如上所示,我当前服务器已经安装 git-1.8.3.1 版本的 git

注:

  • 如果服务器上未安装 git,则执行上面的命令不会有 git 版本的安装信息

(2) root 用户执行如下命令查看 git 版本

[root@blnbpap01 ~]# git --version
git version 1.8.3.1

注:

  • 如果服务器上未安装 git ,则执行上面的命令会提示找不到这样的命令

2 安装 git

(1) CentOS(REHL 系)可执行如下命令安装

[root@blnbpap01 ~]# yum install git

(2) Ubuntu 可执行如下命令安装

[root@blnbpap01 ~]# apt-get install git

注:

  • 安装完成可以使用 1 中的方法校验安装

三、配置 git

1 创建用户

root 用户执行如下命令创建一个用户用于使用 git

[root@blnbpap01 ~]# useradd git -m -U -s /usr/bin/git-shell
[root@blnbpap01 ~]# id git
uid=1007(git) gid=1008(git) groups=1008(git)

注:

  • -m 选项会自动为 git 用户创建 /home/git 的家目录,-U 表示自动为 git 用户创建一个同名的组
  • 用户名 git 可以自行设置
  • -s /usr/bin/git-shell 表示设置 git 用户的登录 shell 为 git-shell (默认为 bash),达到禁用 git 使用 shell 登录的效果,也可以设置为 /sbin/nologin
  • 由于我们设置 git 用户不允许 shell 登录,因此没有给 git 用户设置密码

2 禁用 shell 登录

出于安全考虑(在 git 服务器上配置了公钥的客户端可以免密登录),需要将创建的 git 用户设置为不允许 shell 登录,如果在创建 git 用户的时候没有使用 -s 参数来禁用 shell 登录,可以通过编辑 /etc/passwd 文件来修改。

使用 root 用户执行如下操作编辑 /etc/passwd

[root@blnbpap01 git]# vi /etc/passwd

找到类似下面的一行:

git:x:1007:1008:,,,:/home/git:/bin/bash
改为:
git:x:1007:1008:,,,:/home/git:/usr/bin/git-shell

这样,git 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。

注:

  • 如果创建用户的时候使用 -s /usr/bin/git-shell 创建的,则此步骤可以跳过
  • 也可以设置为 /sbin/nologin

3 配置 ssh 公钥

为了使其他用户能够访问服务器上的 git 代码仓库,需要将客户端的公钥设置到 git 服务器上

示例:
如果现在有一台 Windows 的客户端需要访问 git 服务器上的代码,操作步骤如下:

3.1 客户端设置

(1) 确保在客户端本机已经安装 git

git 在 Windows 上的安装十分简单,不在此介绍,git 下载地址如下:

https://git-for-windows.github.io/

(2) 打开 git bash ,执行如下命令

$ ssh-keygen -t rsa

按 "Enter" 下一步

(3) 设置密钥文件名称及存放位置

在命令窗口提示如下信息的时候,输入一个密钥文件存放位置及名称:

Enter file in which to save the key (/c/Users/jiangzl5/.ssh/id_rsa):

注:

  • (/c/Users/jiangzl5/.ssh/id_rsa) 括号中的内容表示如果你输入,默认存放的位置及文件名称,为了不和其他的密钥混淆,这里使用默认的目录,但在密钥文件名的后面添加一个 .git 用于标识(也可以使用其他任何可以用来标识的字符来标识)

(4) 设置密钥密码

在命令窗口提示如下信息的时候,输入一个密钥文件密码:

Enter passphrase (empty for no passphrase):

可以看见括号中的提示,如果不填写密码,则默认为空。此处不设密码,直接按两次 "Enter" 跳过密码设置。

(5) 生成公钥成功

Your identification has been saved in /c/Users/jiangzl5/.ssh/id_rsa.git.
Your public key has been saved in /c/Users/jiangzl5/.ssh/id_rsa.git.pub.

看见如上两行内容,表示公钥已经生成成功,此处的公钥文件是 id_rsa.git.pub

(6) 查看公钥内容

git bash 命令行执行如下命令,查看生成的公钥内容

$ cat /c/Users/jiangzl5/.ssh/id_rsa.git.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC96mfICLDEQGV8BgnL9KVh4swBbducbRwuUdIRlgB7AMuVQBZce1KNOYxa1KraPI31p+jVzJqnCG4X6YRieDfjGkOUNezEITl32fp4ToeQhYxyOUcd5YiLONF6GgIyn4DOciFHgD/eAasUrxs10wZRwn4Dv1Smz37I6Y2/8AKwI3g48f5sD5PwIe19IEfSRgI4KwVAYOkncgmplxSb2ogY64vjgiJAAk0NLfjvnmc6M4hKla2UL7sRx3UzvYV6dfydNY/IxrFjxJtaqjz8BuzEyJ3FgE+LOoyI+Gv0CQYbcUvjjk2iAzdg3G57dwCnUyF3TbfSnrnpLjg29ugCYjj3 jiangzl5@JIANGZL5-042WYG

注:

  • 此处的命令与你生成的公钥文件的位置与文件名称一致,更改为你的客户端对应的信息

  • 完整操作示例如下

jiangzl5@JIANGZL5-042WYG MINGW64 ~/.ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/jiangzl5/.ssh/id_rsa): /c/Users/jiangzl5/.ssh/id_rsa.git
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/jiangzl5/.ssh/id_rsa.git.
Your public key has been saved in /c/Users/jiangzl5/.ssh/id_rsa.git.pub.
The key fingerprint is:
SHA256:ozgGiFgH9B31yNoJy4n/TFh3y3typNOUXTgk/iEqB0M jiangzl5@JIANGZL5-042WYG
The key's randomart image is:
+---[RSA 2048]----+
| .o ... |
| o . oEo . . |
| . o o.o .. o . |
|oo . o *o. o + .|
|+ . . = So...o =.|
| . o +.ooo .= .|
| + + .o o= |
| . . + +.+ |
| o .= |
+----[SHA256]-----+
jiangzl5@JIANGZL5-042WYG MINGW64 ~/.ssh
$ ll
total 27
-rw-r--r-- 1 jiangzl5 1049089 108 7月 20 11:08 config
-rw-r--r-- 1 jiangzl5 1049089 3243 10月 19 13:33 id_rsa
-rw-r--r-- 1 jiangzl5 1049089 1679 10月 19 13:32 id_rsa.bak
-rw-r--r-- 1 jiangzl5 1049089 1675 10月 22 13:17 id_rsa.git
-rw-r--r-- 1 jiangzl5 1049089 406 10月 22 13:17 id_rsa.git.pub
-rw-r--r-- 1 jiangzl5 1049089 748 10月 19 13:33 id_rsa.pub
-rw-r--r-- 1 jiangzl5 1049089 390 7月 20 11:08 id_rsa.pub.rapid
-rw-r--r-- 1 jiangzl5 1049089 1679 7月 20 11:08 id_rsa.rapid
-rw-r--r-- 1 jiangzl5 1049089 1230 10月 19 11:31 known_hosts

jiangzl5@JIANGZL5-042WYG MINGW64 ~/.ssh
$ cat /c/Users/jiangzl5/.ssh/id_rsa.git.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC96mfICLDEQGV8BgnL9KVh4swBbducbRwuUdIRlgB7AMuVQBZce1KNOYxa1KraPI31p+jVzJqnCG4X6YRieDfjGkOUNezEITl32fp4ToeQhYxyOUcd5YiLONF6GgIyn4DOciFHgD/eAasUrxs10wZRwn4Dv1Smz37I6Y2/8AKwI3g48f5sD5PwIe19IEfSRgI4KwVAYOkncgmplxSb2ogY64vjgiJAAk0NLfjvnmc6M4hKla2UL7sRx3UzvYV6dfydNY/IxrFjxJtaqjz8BuzEyJ3FgE+LOoyI+Gv0CQYbcUvjjk2iAzdg3G57dwCnUyF3TbfSnrnpLjg29ugCYjj3 jiangzl5@JIANGZL5-042WY

(7) 添加 SSH 密钥到 ssh-agent 中

如果你的客户端安装的是 github 的桌面版程序,那么不需要进行如下设置。而如果你的客户端安装的是 git 程序而没有 github desktop,那么需要进行如下设置。

a. 确保 ssh-agent 正在运行

执行如下命令手动启动 ssh-agent 进程

jiangzl5@JIANGZL5-042WYG MINGW64 ~/.ssh
$ eval $(ssh-agent -s)
Agent pid 9668

b. 添加 SSH 密钥到 ssh-agent

执行如下命令,将刚才生成的 id_rsa.git 文件添加到 ssh-agent

$ ssh-add ~/.ssh/id_rsa.git
Identity added: /c/Users/jiangzl5/.ssh/id_rsa.git (/c/Users/jiangzl5/.ssh/id_rsa.git)

注:

  • 如果你生成的文件名不是 id_rsa.git,把它替换成你的 id_rsa 的文件即可,如 id_rsa.bc,id_rsa.kk
3.2 服务器端操作

(1) 创建 .ssh 目录及 authorized_keys 文件

此步骤如果服务器上已经存放此目录及文件,则跳过。root 用户执行如下命令:

[root@blnbpap01 git]# mkdir -p /home/git/.ssh
[root@blnbpap01 git]# touch /home/git/.ssh/authorized_keys
[root@blnbpap01 git]# chown -R git.git /home/git/.ssh
[root@blnbpap01 git]# cd /home/git/.ssh
[root@blnbpap01 .ssh]# ll
total 0
-rw-r--r--. 1 git git 0 Oct 22 01:47 authorized_keys

注:

  • 上述命令中的 git 与创建的用户有关,如果创建的用户名不是 git,替换为创建的用户名
  • .ssh 目录 与 authorized_keys 文件名是固定的,不能更改

(2) 编辑 authorized_keys 文件,添加客户端生成的公钥

root 用户执行如下命令,编辑 authorized_keys ,并将客户端生成的公钥拷贝到文件中(id_rsa.git.pub 文件中的内容),并保存退出

[root@blnbpap01 .ssh]# vim /home/git/.ssh/authorized_keys

注:

  • 一个公钥占用一行,如果有多个客户端公钥,请换行拷贝,保证每行一个公钥,上方的图片示例其实是一行,在屏幕原因导致的自动缩放。
  • 这种方法,每增加一个需要访问 git 仓库的用户,都需要按照这种方式操作一遍。还有另一种方式 ,就是类似于 github 上的 ssh 配置,为用户开一个配置 ssh 的接口,用户自己来配置 ssh 公钥。可以使用 Gitosis 来管理公钥。

三、创建代码仓库

在 git 所在服务器选用一个已经存在的目录或者创建一个新的目录来作为一个代码仓库,此处选用在 /home/git 用户 Home 目录创建一个 repository 用于存放整个 git 代码仓库

1 创建仓库

root 用户执行如下命令在 /home/git 下创建一个 repository 目录

[root@blnbpap01 git]# mkdir -p /home/git/repository
[root@blnbpap01 git]# chown -R git.git repository/

2 创建项目

root 用户执行如下命令,在 /home/git/repository 目录下创建一个项目目录。比如,此处我正在进行的项目是 cbi,那么项目目录名称设置为 cbi

[root@blnbpap01 git]# cd /home/git/repository/
[root@blnbpap01 repository]# mkdir cbi
[root@blnbpap01 repository]# chown -R git.git cbi

3 创建一个 application

一个项目下有可能存在多个 application 工程,比如:portal,ios app,android app,此处创建一个示例的 app 为 application-1。实际项目中以工程的具体功能、名称为准。

root 用户执行如下命令,创建工程目录

[root@blnbpap01 repository]# cd /home/git/repository/cbi
[root@blnbpap01 cbi]# pwd
/home/git/repository/cbi
[root@blnbpap01 cbi]# mkdir application-1
[root@blnbpap01 cbi]# chown -R git.git application-1/

注:

  • 以上步骤是三层目录的方式,即:仓库 -> 项目 -> 工程,这是我偏向的目录结构管理方式,也可以与此目录结构不同。

4 初始化工程

进入刚才创建的工程目录 application-1,root 用户执行如下命令初始化工程

[root@blnbpap01 application-1]# git init --bare
Initialized empty Git repository in /home/git/repository/cbi/application-1/
[root@blnbpap01 application-1]# ll
total 32
drwxr-xr-x. 2 root root 4096 Oct 22 02:19 branches
-rw-r--r--. 1 root root 66 Oct 22 02:19 config
-rw-r--r--. 1 root root 73 Oct 22 02:19 description
-rw-r--r--. 1 root root 23 Oct 22 02:19 HEAD
drwxr-xr-x. 2 root root 4096 Oct 22 02:19 hooks
drwxr-xr-x. 2 root root 4096 Oct 22 02:19 info
drwxr-xr-x. 4 root root 4096 Oct 22 02:19 objects
drwxr-xr-x. 4 root root 4096 Oct 22 02:19 refs
[root@blnbpap01 application-1]# chown -R git.git *
[root@blnbpap01 application-1]# ll
total 32
drwxr-xr-x. 2 git git 4096 Oct 22 02:19 branches
-rw-r--r--. 1 git git 66 Oct 22 02:19 config
-rw-r--r--. 1 git git 73 Oct 22 02:19 description
-rw-r--r--. 1 git git 23 Oct 22 02:19 HEAD
drwxr-xr-x. 2 git git 4096 Oct 22 02:19 hooks
drwxr-xr-x. 2 git git 4096 Oct 22 02:19 info
drwxr-xr-x. 4 git git 4096 Oct 22 02:19 objects
drwxr-xr-x. 4 git git 4096 Oct 22 02:19 refs

注:

  • 由于我们在之前禁用了 git 的 shell 登录,因此,我们全部都使用 root 用户来操作,然后更改用户权限。也可以使用其他具有 sudo 权限的用户执行这些操作。

四、克隆与提交代码

在进行完上述的各种操作之后,我们已经配置好了客户端与服务器端的各种配置,并初始化了一个工程名叫 application-1。现在我们可以在客户端进行 clone ,commit,push 等操作了

1 clone

在 git bash 的命令行执行如下命令即可克隆工程到本地:

$ pwd
/d/code
$ git clone git@ip:/home/git/repository/cbi/application-1
Cloning into 'application-1'...
warning: You appear to have cloned an empty repository.
$ ll
total 0
drwxr-xr-x 1 jiangzl5 1049089 0 10月 22 14:46 application-1/

注:

  • 上方 ip 请替换成自己的 git server 的 IP

下方是一些简单的查看操作:

$ cd application-1/
jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git log
fatal: your current branch 'master' does not have any commits yet
jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

2 添加文件

下面是在 application-1 目录下添加一个 README.txt 文件,并在其中写上 "Hello Git"

jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ echo "Hello Git" > README.txt
jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ ll
total 1
-rw-r--r-- 1 jiangzl5 1049089 10 10月 22 15:08 README.txt
jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git status
On branch master
Initial commit
Untracked files:
(use "git add ..." to include in what will be committed)
README.txt
nothing added to commit but untracked files present (use "git add" to track)

可以看到 git 已经在提示 README.txt 还未添加到待提交区(stage)

3 git add

jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git add README.txt
warning: LF will be replaced by CRLF in README.txt.
The file will have its original line endings in your working directory.

4 git commit

$ git commit -am "add file README.txt"
[master (root-commit) f828f7a] add file README.txt
1 file changed, 1 insertion(+)
create mode 100644 README.txt

jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working tree clean

5 git push

$ git push git@ip:/home/git/repository/cbi/application-1
Counting objects: 3, done.
Writing objects: 100% (3/3), 236 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 10.122.22.176:/home/git/repository/cbi/application-1
* [new branch] master -> master

jiangzl5@JIANGZL5-042WYG MINGW64 /d/code/application-1 (master)
$ git log
commit f828f7a457f69e71cf10e45115dc4a1d64aa5ebc (HEAD -> master)
Author: jiang zhuolin 
Date: Sun Oct 22 15:15:44 2017 +0800
add file README.txt

注:

  • 上方 ip 请替换成自己的 git server 的 IP

至此,git 服务器的搭建以及简单的 git 操作便完成了。

附录一:更细化的权限控制

当我们在一个项目目录下创建多个工程的时候(cbi/application-1,cbi/application-2),如果其中一个用户配置了公钥后,他只要知道其中的工程名称,就能轻易的克隆代码和提交代码,这对于代码安全有一定的风险。
因此,对于更细更好的权限控制可以通过 Gitolite 来实现,此处不详述 Gitolite 的使用,会在其他文档中单独讲解。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注