上面我们分别独立安装好了msysgit和apache,现在就可以配置git服务器了。
一、创建test.git库
为验证安装是否正确,我们首先需要创建一个git库,然后通过http://来访问。git库本身可以独立使用,并不一定要求通过http://来访问,用file:///就可进行本地访问,但通过http://我们就允许别人远程访问。
注意,这里说的本地和远程可能有些误导,就git而言两个库不论是否在同一台机,从一个库访问另一个库就称为远程访问。
与apache集成时需要将所有的git库都放到一个根目录下,这里我选择E:/git-parent/作为根。你也可以选择其它目录作为根,但你按照本文档配置时要注意把根目录修改为你自己设定的目录。
下面我们就来在根目录下创建一个名为test.git库。创建git库可以有多种方式,你可以使用你喜欢的任何工具来创建,比如TortoiseGit图形工具。不过用git-bash命令表述起来更直接一些。
下面我们用git-bash来操作。
$ mkdir /e/git-parent
$ cd /e/git-parent $ mkdir test.git $ cd test.git $ git init --bare Initialized empty Git repository in e:/git-parent/test.git/
$ ls -l total 2 -rw-r--r-- 1 yangwu Administ 23 Oct 5 00:26 HEAD -rw-r--r-- 1 yangwu Administ 131 Oct 5 00:26 config -rw-r--r-- 1 yangwu Administ 73 Oct 5 00:26 description drwxr-xr-x 1 yangwu Administ 0 Oct 5 00:26 hooks drwxr-xr-x 1 yangwu Administ 0 Oct 5 00:26 info drwxr-xr-x 1 yangwu Administ 0 Oct 5 00:26 objects drwxr-xr-x 1 yangwu Administ 0 Oct 5 00:26 refs
git库其实是一个目录,里面有git的一些系统文件。注意,git库有两种形式,如上,我们创建的是bare形式的git库,这个库里不允许放入我们工作的文件。另一个形式是带.git隐藏子目录的库,这个库允许放入工作文件(git称之为工作树,Working Tree),当然工作文件不是放在.git隐藏子目录里。在服务器上要创建bare形式的git库。
上面我们创建了test.git库,若要克隆这个库可这样操作:
$ git clone file:///E:/git-parent/test.git Cloning into 'test'... remote: Counting objects: 15, done. remote: Compressing objects: 100% (9/9), done. remote: Total 15 (delta 2), reused 0 (delta 0) Receiving objects: 100% (15/15), done. Resolving deltas: 100% (2/2), done.
也可直接用Windows的语法来写:
$ git clone E:\git-parent\test.git
其结果是一样的。不过本文的目的是想通过下面的http语法来访问:
$ git clone http://localhost/test.git
为支持用http来访问git库,我们可以安装和设置Apache HTTP Server。
二、设置Apache HTTP Server
默认地,Apache的安装目录为
C:\Program Files\Apache Software Foundation\Apache2.2
为使我们能通过http://来访问git库,我们需要编辑Apache的conf\httpd.conf配置文件。
在httpd.conf文件最后加上:
SetEnv GIT_PROJECT_ROOT E:/git-parent SetEnv GIT_HTTP_EXPORT_ALL 1 ScriptAliasMatch \ "(?x)^/(.*/(HEAD | \ info/refs | \ objects/(info/[^/]+ | \ [0-9a-f]{2}/[0-9a-f]{38} | \ pack/pack-[0-9a-f]{40}.(pack|idx)) | \ git-(upload|receive)-pack))$" \ "C:/Program Files/Git/libexec/git-core/git-http-backend.exe/$1" <Directory "C:/Program Files/Git/libexec/git-core/"> Allow from all </Directory>
对这些设置的理解需要懂得apache的知识,在此不再赘述,有兴趣的人可参见http://httpd.apache.org/。但有几点需要提醒:
-
- 注意上面第二行最后那个空格和1,网上大多数教程都没有加上,导致运行不起来。关于这一点在http://www.devbean.info/2011/10/apache-git-server-on-windows/上有提及。
我想,网上教程大多数是从linux移植过来的,linux允许环境变量只有变量名没有值,而Windows不允许。沿此思路,其实不一定需要设置为1,设置任意值也行。另一方面,网上教程在作者本人的机器上肯定是能跑通的,这或许是因为这个环境变量已经在操作系统里设置了,或者与下面一点有关。
- 据这篇文章介绍,我们也可以不用定义GIT_HTTP_EXPORT_ALL环境变量,而是在每个git库目录下新建一个名为git-daemon-export-ok的空文件,麻烦的是每次新建git库时都要新建这个空文件,并且容易忘记。
- 另请注意的是,第三行其实是很多行组成的,别忘了后面的“\”连接符。网上有些教程或许是网页排版的原因看不到这个连接符。
- 注意上面第二行最后那个空格和1,网上大多数教程都没有加上,导致运行不起来。关于这一点在http://www.devbean.info/2011/10/apache-git-server-on-windows/上有提及。
完成上面的设置后请重新启动Apache服务器,并检查是否成功启动。如果不能成功启动,请检查上面的根目录和git-http-backend.exe所在目录与你机器的实际情况是否一致,并查看Apache的日志以获得更多的排错信息。
三、测试安装
为验证上面安装的正确性,我们分三步来执行,第一步是克隆test.git库,第二步是新加一个文件并push到test.git库里,第三步是从test.git再克隆一个库,并检查是否有刚新加的文件。
1、新建一个目录,然后从test.git库克隆
下面我们仍然用git-bash来操作。我们将新建c:\work目录,然后在work目录里克隆刚才新建的test.git库。
$ mkdir /c/work $ cd /c/work $ git clone http://localhost/test.git Cloning into 'test'... warning: You appear to have cloned an empty repository.
上面克隆了test.git库。git给了个警告,提示我们克隆了一个空库。这个警告可忽略不理。另请注意的是,在httpd.conf里端口号默认为80,如果你用的端口号不是80请修改上面git clone命令。
接下来我们看看上面的命令做了什么:
$ pwd
/c/work
$ ls
test
$ cd test $ ls -a . .. .git
我们看到新建了c:\work\test目录,这个目录下有个.git隐藏目录,这表示c:\work\test是一个本地库。
2、新增一个文件并push到test.git库
下面我们在c:\work\test目录下随便创建一个名为apple.txt的文件,然后提交:
$ pwd /c/work/test $ touch apple.txt $ git add apple.txt $ git commit -m "added apple.txt" [master (root-commit) 51f3395] added apple.txt 1 file changed, 1 insertion(+) create mode 100644 apple.txt
上面我们新加了个apple.txt文件并提交到本地库,接下来我们push到远程test.git库:
$ pwd /c/work/test $ git push origin master error: Cannot access URL http://localhost/test.git/, return code 22 fatal: git-http-push failed
这里发生了一个错误,解决办法是编辑E:\git-parent\test.git\config文件,加上两行:
[http] receivepack = true
接着重新操作:
$ pwd /c/work/test $ git push origin master Writing objects: 100% (3/3) Writing objects: 100% (3/3), 214 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To http://localhost/test.git * [new branch] master -> master
push成功了。
3、重新从test.git克隆一个库,看看里面有没有刚push进去的apple.txt文件。
如果你还想验证是否真的push进去了,你可换一个目录再克隆一遍,看看新克隆的本地库里有没有刚才push进去的apple.txt文件。
三、另建新git库
上面我们在根目录下创建了test.git库。如果还需要建其它库,可以直接在根目录下建,不需再修改httpd.conf文件,也不需要重新启动apache就可访问得到。
四、授权访问
上面的配置使用了匿名访问方式,若要授权方式访问可参见这篇文章。
参考资料:
1、http://www.jeremyskinner.co.uk/2010/07/31/hosting-a-git-server-under-apache-on-windows/
按这个教程配置时,请注意三点(上面已说到,再说一次):
* 在“SetEnv GIT_HTTP_EXPORT_ALL”后面加上空格和1。
* ScriptAliasMatch及以后几行要加上“\”连接符。
* 检查目录是否与本机目录情况一致。