root 用户执行如下命令查看 git 版本
[root@blnbpap01 ~]# git --version
git version 1.8.3.1
CentOS(REHL 系)可执行如下命令安装
[root@blnbpap01 ~]# yum install 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)
注:
出于安全考虑(在 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
为了使其他用户能够访问服务器上的 git 代码仓库,需要将客户端的公钥设置到 git 服务器上
示例:
如果现在有一台 Windows 的客户端需要访问 git 服务器上的代码,操作步骤如下:
git 在 Windows 上的安装十分简单,不在此介绍,git 下载地址如下:
https://git-for-windows.github.io/
$ ssh-keygen -t rsa
按 “Enter” 下一步
在命令窗口提示如下信息的时候,输入一个密钥文件存放位置及名称:
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” 跳过密码设置。
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
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
如果你的客户端安装的是 github 的桌面版程序,那么不需要进行如下设置。而如果你的客户端安装的是 git 程序而没有 github desktop,那么需要进行如下设置。
执行如下命令手动启动 ssh-agent 进程
jiangzl5@JIANGZL5-042WYG MINGW64 ~/.ssh
$ eval $(ssh-agent -s)
Agent pid 9668
执行如下命令,将刚才生成的 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
此步骤如果服务器上已经存放此目录及文件,则跳过。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 文件名是固定的,不能更改
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 代码仓库
root 用户执行如下命令在 /home/git 下创建一个 repository 目录
[root@blnbpap01 git]# mkdir -p /home/git/repository
[root@blnbpap01 git]# chown -R git.git repository/
root 用户执行如下命令,在 /home/git/repository 目录下创建一个项目目录。比如,此处我正在进行的项目是 cbi,那么项目目录名称设置为 cbi
[root@blnbpap01 git]# cd /home/git/repository/
[root@blnbpap01 repository]# mkdir projects
[root@blnbpap01 repository]# chown -R git.git projects
一个项目下有可能存在多个 application 工程,比如:portal,ios app,android app,此处创建一个示例的 app 为 application-1。实际项目中以工程的具体功能、名称为准。
root 用户执行如下命令,创建工程目录
[root@blnbpap01 repository]# cd /home/git/repository/projects
[root@blnbpap01 projects]# pwd
/home/git/repository/ projects
[root@blnbpap01 projects]# mkdir node
[root@blnbpap01 projects]# chown -R git.git node/
注:
以上步骤是三层目录的方式,即:仓库 -> 项目 -> 工程,这是我偏向的目录结构管理方式,也可以与此目录结构不同。
进入刚才创建的工程目录 application-1,root 用户执行如下命令初始化工程
[root@blnbpap01 application-1]# git init --bare
Initialized empty Git repository in /home/git/repository/projects/node/
[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 等操作了
在 git bash 的命令行执行如下命令即可克隆工程到本地:
$ pwd
/d/code
$ git clone git@ip:/home/git/repository/projects/node
Cloning into 'node'...
warning: You appear to have cloned an empty repository.
$ ll
total 0
drwxr-xr-x 1 jiangzl5 1049089 0 10月 22 14:46 node/
注:
上方 ip 请替换成自己的 git server 的 IP
下方是一些简单的查看操作:
$ cd node/
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)
下面是在 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)
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.
$ 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
$ 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 操作便完成了。