msysgit+apache安装说明 - git服务器部分

上面我们分别独立安装好了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库时都要新建这个空文件,并且容易忘记。
    • 另请注意的是,第三行其实是很多行组成的,别忘了后面的“\”连接符。网上有些教程或许是网页排版的原因看不到这个连接符。

完成上面的设置后请重新启动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及以后几行要加上“\”连接符。
* 检查目录是否与本机目录情况一致。

posted @ 2012-10-07 21:12  yang wu  阅读(1425)  评论(3编辑  收藏  举报