服务器使用git协议

1.    前言

         最近在服务器上搭建支持git协议的版本库,遇到了些麻烦(主要是因为对linux系统不太熟悉导致),在此小做笔记,以供自己和他人参阅。

         我的环境如下表所示,我通过另一台机器克隆版本库来验证:git clone git://192.168.1.101/path/to/repos/mygit.git mygit

linux服务器系统

Ip地址

版本库路径

debian

192.168.1.101

/path/to/repos/mygit.git

2.    Git协议概要

Git协议是提供git版本库只读服务的常用协议(匿名读取),该协议的缺点就是不能提供身份认证,也真是因为写操作没有授权控制,因此一般不用来提供写操作。

         对于提供公共的,非授权的只读访问,Git协议在性能和速度上远比HTTP协议高效,所以对于提供只读的版本库,我们常用git协议,而不用http协议。

3.    Git协议部署

3.1. 部署原理

从原理上来讲,Git 协议的配置很简单。基本上,只要以守护进程的形式运行git-daemon服务软件即可,即以守护进程的形式运行以下参数(参数何意,后面会讲):

git daemon --inetd --verbose --export-all /path/to/repos

         以守护进程的形式运行该进程的方法有很多,我前后用过两种方式实现:inetdxinetd,其实xinetdinetd的升级版(大家用xinetd就好,我是抱着学习的态度才试着用inetd的),你可以到xinetd的官网看看它介绍就知道了:http://www.xinetd.org/,有关inetdxinetd的细节不在本本文讨论范围内。

3.2. 部署inetd

         inetd到底是什么东东,自己先问下“度娘”或者“谷歌”,要先有个简单的了解。也可以参考man inetd帮助文档(特别是学习完后再回过头来看更有效果)。

3.2.1. 安装

sudo aptitude install netkit-inetd

发现可找到,但无论如何也安装不对。提示了一个信息要指定一个确定安装软件,有一个是openbsd-inetd。继续查找:netkit-inetd已经由openbsd-inetd所替代。于是安装openbsd-inetd

sudo aptitude install openbsd-inetd

注意:不同的linux系统,情况估计跟我的不一样。

 

安装成功后,先用以下命令看看inetd运行了没有:

ps ax |grep inetd

先看看openbsd-inetd支持的参数有哪些,输入/etc/init.d/openbsd-inetd –help看帮助:

# /etc/init.d/openbsd-inetd --help

Usage: /etc/init.d/openbsd-inetd {start|stop|reload|force-reload|restart|status}

         常用的命令:

/etc/init.d/openbsd-inetd start

启动inetd

/etc/init.d/openbsd-inetd stop

停止inetd

/etc/init.d/openbsd-inetd restart

重启inetd

/etc/init.d/openbsd-inetd reload

修改了配置文件inetd.conf,可以通过该命令使配置立刻生效

3.2.2. 修改配置文件

注意:可以通过man inetd.conf来查看详细的参数说明。        

在配置文件/etc/inetd.conf中添加如下设置:

git stream tcp nowait nobody /usr/lib/git-core/git git daemon --inetd --verbose --export-all /path/to/repos

说明:

◇在配置文件中,以上只是一行

/usr/lib/git-core/git是我git程序所在位置,git daemon后面是运行git的参数。

◇默认git-daemon只对包含文件git-daemon-export-ok的版本库提供服务。使用--export-all后,无论版本库是否存在标识文件git-daemon-export-ok,都对版本库提供git访问服务。

◇其中/path/to/repos是我在linux服务器上git版本库的存放目录。

git daemon的参数很多,这里只列出了简单的用法,有兴趣的可以通过git daemon –help或者man inetd.conf帮助慢慢研究。

3.2.3. 使配置立刻生效

         修改了配置文件后,可以通过/etc/init.d/openbsd-inetd restart或者/etc/init.d/openbsd-inetd reload来使配置马上生效。我这里介绍另一种方法。

git-daemon运行时,inetd会读取它的配置文件,默认为/etc/inetd.conf。如果修改了该配置文件,给inetd进程发一个SIGHUP信号,inetd在接收到SIGHUP挂起信号后会重新读取其配置文件。按如下步骤给inetd进程发送一个SIGHUP信号:

◇找出inetd进程的process number

ps ax | grep inetd

230 ?? Ss 0:00.01 inetd

20392 std S+ 0:00.01 grep inetd

从上面可以看出,我这里的process number'230'

◇发送SIGHUP信号

sudo kill - SIGHUP 230

 

至此,你就可以通过git协议克隆版本库了。

3.3. 部署xinetd

         既然xinetdinetd的替代版,建议大家都使用xinetd,需要给你一个替代的理由?去官网看:http://www.xinetd.org/,你可以通过man xinetd来看下帮助手册。

3.3.1. 安装


sudo aptitude install xinetd

或者去官网下载最新源码进行安装。安装成功后,你可以搜索下xinetd文件,发现可执行的文件有两个:/etc/init.d/xinetd和/usr/sbin/xinetd,其他的要么是文件夹要么没有可执行的权限。(注意:不同的linux系统可能路径不太一样)。

# find / -name xinetd –exec  ls -idl {} \;

665609 -rwxr-xr-x 1 root root 2063  3月 27 2008 /etc/init.d/xinetd

665608 -rw-r--r-- 1 root root 316  3月 27 2008 /etc/default/xinetd

263351 -rwxr-xr-x 1 root root 133908  3月 27 2008 /usr/sbin/xinetd

269429 drwxr-xr-x 3 root root 4096 10月 24 11:01 /usr/share/doc/xinetd

3281001 -rw-r--r-- 1 root root 28 10月 24 11:01 /var/lib/update-rc.d/xinetd

         我一度没弄明白要用哪个路径下的xinetd来启动,好像两个都可以启动xinetd服务。后来才发现/usr/sbin/xinetd才是真正的执行程序,而/etc/init.d/xinetd文件是shell脚本(最终也是调用/usr/sbin/xinetd来执行)。

         如果要看/usr/sbin/xinetd程序支持哪些参数,可以manxinetd查看帮助。如果要看/etc/init.d/xinetd脚本支持哪些参数,可以/etc/init.d/xinetd –help查看。是不是有点乱,不要搞混了,你可以打开/etc/init.d/xinetd脚本文件看看里面的内容应该就明白了。

         可以通过以下命令查看下xinetd有没有有运行:

ps ax | grep xinetd

         如果没有运行,可以通过以下命令来启动xinetd:

/etc/init.d/xinetd start

启动xinetd

/etc/init.d/xinetd stop

停止xinetd

/etc/init.d/xinetd restart

重启xinetd

另外,如果你想看xinetd运行过程中的log信息(如果你配置文件写错了,从log中就能发现错误,有助于排查问题),可以用以下命令,其中/xinetdlog.txt就是log文件。

/usr/sbin/xinetd -filelog /xinetdlog.txt

3.3.2. 修改配置文件

注意:可以通过man xinetd.conf来查看详细的参数说明。

成功安装后,可以看到/etc/xinetd.conf配置文件,这跟inetd不同,你不能在这里直接修改,你需要在/etc/xinetd.d/目录下创建一个git-daemon文件,文件内容如下:

# default: off

# description: The git server offers access to git repositories

service git

{

   disable       = no

   type            = UNLISTED

   port            = 9418

   socket_type     = stream

   wait            = no

   user            = nobody

   server          = /usr/local/bin/git

   server_args     = daemon --inetd --verbose --export-all  /path/to/repos

   log_on_failure  += USERID

}

3.3.3. 使配置立刻生效

         /etc/xinetd.d/目录里新加/修改配置文件,重启xinetd即可生效:

/etc/rc.d/init.d/xinetd restart

4.    提供简短的URL地址

我们上面使用的URLgit://192.168.1.101/path/to/repos/mygit.git,如果版本库的路径比较深,有什么办法能在用户访问时提供短一些的URL地址呢?可以为git daemon使用--base-path参数建立版本库根目录映射,如inetd.conf配置文件写成这样:

git stream tcp nowait nobody /usr/lib/git-core/git git daemon --inetd --verbose --export-all --base-path=/path/to/repos /path/to/repos

         那么我们就可以用git://192.168.1.101/mygit.git来访问版本库。

5.    其他

         Git协议的默认端口是9418,通过以下命令可以验证,当然你也可以不用默认端口。

# grep 9418 /etc/services

git            9418/tcp                        # git pack transfer service

git            9418/udp                        # git pack transfer service

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值