搭建git服务器:
首先要选择搭建git时的协议,在文档里有三种协议
1.本地协议:就是多人使用一台电脑,就是使用不同的账号登录同一台电脑,使用共享文件来同时进行操作,很危险。因为你的所有代码版本库如果长存于同一台电脑,更可能发生灾难性的损失。使用命令为:
1 $ git clone /opt/git/project.git
注意:因此本地协议常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的 NFS)拥有访问权,通过共享文件夹避免多人使用一台电脑的缺点(单点问题)。
使用本地协议执行如下的命令:
1 $ git clone /opt/git/project.git
或可以执行这个命令:
1 $ git clone file:///opt/git/project.git
如果在 URL 开头明确的指定 file://,那么 Git 的行为会略有不同。 如果仅是指定路径,Git 会尝试使用硬链接(hard link)或直接复制所需要的文件。 如果指定 file://,Git 会触发平时用于网路传输资料的进程,那通常是传输效率较低的方法。 指定 file:// 的主要目的是取得一个没有外部参考(extraneous references)或对象(object)的干净版本库副本– 通常是在从其他版本控制系统导入后或一些类似情况需要这么做。 在此我们将使用普通路径(即/opt/git/project.git),因为这样通常更快。
2.HTTP 协议: http协议又分为两种 一种为智能(Smart) HTTP 协议 和 哑(Dumb) HTTP 协议 。命令类似于
1 $ git clone https://example.com/gitproject.git
3.ssh协议: 架设 Git 服务器时常用 SSH 协议作为传输协议,优点大多数环境下已经支持 SSH 访问,并且非常普遍性,架设和使用都很容易。命令类似于:
1 $ git clone ssh://user@server/project.git
4.git协议:
Git 协议包含在 Git 里的一个特殊的守护进程(即要安装git-daemon软件包);它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。 要让版本库支持 Git 协议,需要先创建一个 git-daemon-export-ok 文件 —— 它是 Git 协议守护进程为这个版本库提供服务的必要条件 —— 但是除此之外没有任何安全措施。 要么谁都可以克隆这个版本库,要么谁也不能。 这意味着,通常不能通过 Git 协议推送。 由于没有授权机制,一旦你开放推送操作,意味着网络上知道这个项目 URL 的人都可以向项目推送数据。 不用说,极少会有人这么做。
注意:git-daemon-export-ok 文件是告诉Git 协议哪个仓库提供无授权访问。
所以你需要告诉 Git 哪些仓库允许基于服务器的无授权访问。 你可以在相关仓库下创建一个名为 git-daemon-export-ok 的文件来实现。如下:
1 $ cd /path/to/project.git //进入Git服务器上的project.git版本库存储路径
2 $ touch git-daemon-export-ok
但有些人会发现自己的版本库没有创建git-daemon-export-ok,而在git clone过程能无授权访问。那是为什么?是因为在git-daemon守护进程启动过程中使用了--export-all 参数选项。
--export-all :使用该选项后,在git仓库中就不必创建git-daemon-export-ok文件。如果不使用该选项,则还需要创建git-daemon-export-ok文件。
Git 协议优点:目前,Git 协议是 Git 使用的网络传输协议里最快的。
Git 协议缺点:是缺乏授权机制。 把 Git 协议作为访问项目版本库的唯一手段是不可取的。 一般的做法里,会同时提供 SSH 或者 HTTPS 协议的访问服务,只让少数几个开发者有推送(写)权限,其他人通过 git:// 访问只有读权限。 Git 协议也许也是最难架设的。 它要求有自己的守护进程,这就要配置 xinetd 或者其他的程序,这些工作并不简单。 它还要求防火墙开放 9418 端口,但是企业防火墙一般不会开放这个非标准端口。 而大型的企业防火墙通常会封锁这个端口。
本例搭建本地协议的git服务器:
在搭建本地协议的git服务器以多人使用一台电脑的场景开始,系统以Centos 7为环境:
1)服务器创建一个空版本库:
[root@db-52 ~]# yum -y install git //安装git
[root@db-52 ~]# mkdir /var/git //版本库目录
[root@db-52 ~]# cd /var/git
[root@db-52 git]# git init --bare /var/git/wordpress.git //创建名为wordpress.git空版本库
2)查看版本库的权限
1 [root@db-52 ~]# ll -d /var/git/wordpress.git
2 drwxr-xr-x. 7 root root 4096 9月 29 01:34 /var/git/wordpress.git
3)创建用户,以模拟多人使用一台电脑
1 [root@db-52 ~]# useradd tom
2 [root@db-52 ~]# useradd jack
3 [root@db-52 ~]# echo 1 | passwd --stdin tom
4 [root@db-52 ~]# echo 1 | passwd --stdin jack
4)添加权限:修改对wordpress版本添加tom,jack用户权限(git push需要对wordpress的w权限)
规划:对WordPress库 tom用户有rw的读和提交权限;jack用户只有r的读的权限。
1 [root@db-52 ~]# ll -d /var/git/wordpress.git
2 drwxr-xr-x. 7 root root 4096 9月 29 01:34 /var/git/wordpress.git
3 [root@db-52 ~]# getfacl /var/git/wordpress.git/
4 getfacl: Removing leading '/' from absolute path names
5 # file: var/git/wordpress.git/
6 # owner: root
7 # group: root
8 user::rwx
9 group::r-x
10 other::r-x
11 [root@db-52 ~]# setfacl -Rm u:tom:rwx /var/git/wordpress.git/
12 [root@db-52 ~]# setfacl -Rm u:jack:rx /var/git/wordpress.git/
13 [root@db-52 ~]# getfacl /var/git/wordpress.git/
14 getfacl: Removing leading '/' from absolute path names
15 # file: var/git/wordpress.git/
16 # owner: root
17 # group: root
18 user::rwx
19 user:tom:rwx
20 user:jack:r-x
21 group::r-x
22 mask::rwx
23 other::r-x
5)tom对WordPress版本库进行下载并提交新增内容
1 [root@db-52 ~]# su - tom
2 [tom@db-52 ~]$ mkdir git
3 [tom@db-52 ~]$ cd git/
4 [tom@db-52 git]$ git clone file:///var/git/wordpress.git //下载一个版本库
5 正克隆到 'wordpress'...
6 warning: 您似乎克隆了一个空版本库。
7 [tom@db-52 git]$ ls
8 wordpress
9 [tom@db-52 git]$ cd wordpress/
10 [tom@db-52 wordpress]$ echo wx > index.html
11 [tom@db-52 wordpress]$ echo tom > tom.txt
12 [tom@db-52 ~]$ git config --global push.default simple
13 [tom@db-52 wordpress]$ git config --global user.email "tom@example.com" //全局配置邮箱
14 [tom@db-52 wordpress]$ git config --global user.name "tom" //全局配置用户名
15 [tom@db-52 wordpress]$ git add . //
16 [tom@db-52 wordpress]$ git commit -m "tom code" //
17 [master(根提交) b693669] tom code
18 2 files changed, 2 insertions(+)
19 create mode 100644 index.html
20 create mode 100644 tom.txt
21 [tom@db-52 wordpress]$ git push //上传新增内容
22 Counting objects: 4, done.
23 Compressing objects: 100% (2/2), done.
24 Writing objects: 100% (4/4), 250 bytes | 0 bytes/s, done.
25 Total 4 (delta 0), reused 0 (delta 0)
26 To file:///var/git/wordpress.git
27 * [new branch] master -> master
28 [tom@db-52 wordpress]$ exit
6)jack用户对WordPress版本库只有下载无提交功能。
1 [root@db-52 ~]# su - jack
2 [jack@db-52 ~]$ mkdir git
3 [jack@db-52 ~]$ cd git
4 [jack@db-52 git]$ git clone file:///var/git/wordpress.git/
5 正克隆到 'wordpress'...
6 remote: Counting objects: 4, done.
7 remote: Compressing objects: 100% (2/2), done.
8 remote: Total 4 (delta 0), reused 0 (delta 0)
9 接收对象中: 100% (4/4), done.
10 [jack@db-52 git]$ ls
11 wordpress
12 [jack@db-52 git]$ cd wordpress/
13 [jack@db-52 wordpress]$ ls
14 index.html tom.txt
15
16 [jack@db-52 wordpress]$ echo jack > jack.txt
17 [jack@db-52 wordpress]$ git config --global user.email "jack@example.com"
18 [jack@db-52 wordpress]$ git config --global user.name "jack"
19 [jack@db-52 wordpress]$ git config --global push.default simple
20
21
22 [jack@db-52 wordpress]$ git add .
23 [jack@db-52 wordpress]$ git commit -m 'jack code'
24 [master 66b1be3] jack code
25 1 file changed, 1 insertion(+)
26 create mode 100644 jack.txt
27 [jack@db-52 wordpress]$ git push
28 Counting objects: 4, done.
29 Compressing objects: 100% (2/2), done.
30 Writing objects: 100% (4/4), 250 bytes | 0 bytes/s, done.
31 Total 4 (delta 0), reused 0 (delta 0)
32 remote: error: insufficient permission for adding an object to repository database ./objects
33 remote: fatal: failed to write object
34 error: unpack failed: unpack-objects abnormal exit
35 To file:///var/git/wordpress.git
36 ! [remote rejected] master -> master (unpacker error)
37 error: 无法推送一些引用到 'file:///var/git/wordpress.git'
38 [jack@db-52 wordpress]$
补充:
1)git配置文件的优先级
.git/conifg > ~/.gitconfig > etc/gitconfig
说明:
第一个(.git/conifg)指的是特定版本库的配置文件;
第二个(~/.gitconfig)是当前系统用户环境下的配置文件;
第三个(etc/gitconfig)是系统级别的配置文件。
搭建中引出问题:
1)/etc/services
2)/etc/inetd