首页 Git 搭建 Windows 上 Apache + Git 服务器

搭建 Windows 上 Apache + Git 服务器

30 3.2K

在公司一直使用 SVN 作版本控制,不过 SVN 的 branch 是在过于灵活。我们所希望的只是一种简单的分支系统:各个分支能够完全独立开来,不会牵扯到复杂的 merge 操作。因此,决定搭建一个 Git 服务器。由于目前没有合适的 Linux 服务器,因此只能尝试在 Windows 上搭建。

在 Windows 上搭建 Git 服务器一般使用 SSL + putty + msysGit 完成。不过按照网上的做法始终不能成功。所以开始选择另外的一种搭建方法:基于 Apache 服务器搭建 Git 服务器。这样做的好处是免除了 SSH 在 Windows 上的配置,同时可以使用 HTTP(S) 协议访问版本库。经过一番尝试,终于实现了在 Windows 上搭建好 Apache + Git 服务器,现在将搭建方法记录于此。

第一步:安装 Git

由于 Git 官方没有提供 Windows 上的安装程序,我们只能使用第三方实现。好在还是有不错的选择,而且其实现也算是比较完美。我选择的是 msysGit,你可以从这里下载到最新版本。在本文写作时,最新版本是 1.7.6。下载完成后直接双击安装就可以。这里需要注意的是,网上有些文章声称,需要在安装时选择 Run git from the Windows Command prompt。对此持保留意见,因为不选择这一项也是可以的。不过为了谨慎起见,还是选择此项为好。

安装完毕后,开始菜单会多出 Git 一项,里面有 Git GUI 和 Git Bash,前者是图形界面,后者是命令行界面。msysGit 默认的安装路径是 C:\Program Files\Git。下面我们可以进入 C:\Program Files\Git\libexec\git-core 目录,双击运行 git-http-backend.exe 程序。这个程序的作用就是处理 HTTP 请求。不过,此时你应该得到一个错误:

git error no dll

这个错误是说缺少 libiconv-2.dll。该文件位于 C:\Program Files\Git\bin。我们可以将其从这里复制到 C:\Program Files\Git\libexec\git-core 即可。

第二步:安装 Apache 服务器

下一步,你应该安装 Apache 服务器。从这里可以找到安装文件(包含 OpenSSL)。本文写作时最新稳定版本是 2.2.21。正常安装之后,Apache 会自动启动,并且占据 80 端口。你可以根据需要修改监听端口。然后我们打开浏览器,进入 http://localhost。如果浏览器页面显示 It works! 说明我们的服务器已经正确安装,那么就可以进行下一步操作了。

第三步:配置 Apache 服务器

现在,我们的 Git 和 Apache 都已经安装成功,下面就是配置 Apache 服务器。

进入 Apache 安装目录下的 conf 目录,用记事本打开 httpd.conf 文件。首先,找到<directory />,修改如下:

<directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</directory>

然后在 httpd.conf 文件末尾追加:

# Set this to the root folder containing your Git repositories.
# 指定 Git 版本库的位置
SetEnv GIT_PROJECT_ROOT C:/workspace

# Set this to export all projects by default (by default,
# git will only publish those repositories that contain a
# file named “git-daemon-export-ok”
# 该目录下的所有版本库都可以透过 HTTP(S) 的方式存取
SetEnv GIT_HTTP_EXPORT_ALL

# Route specific URLS matching this regular expression to the git http server.
# 令 Apache 把 Git 相关 URL 导向给 Git 的 http 处理程序
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"

<Location />
AuthType Basic
AuthName "GIT Repository"
AuthUserFile "C:/Program Files/Git/htpasswd"
Require valid-user
</Location>

上面修改内容中,第一个指令设置 Git 的版本库位置;第二个指令表示,该目录下的所有版本库都可以通过 HTTP(S) 的方式存取;第三个指令则是让 Apache 把 Git 相关 URL 导向给 Git 的 HTTP 处理程序,也就是我们前面提到的 git-http-backend.exe。最后的<Location />区段设定了虚拟根路径 "/" 的验证规则;C:/Program Files/Git/htpasswd 是账号密码文件,该文件可以在任何位置,也可以使任何名字,只要在这里指定即可。

完成上述修改之后,重启 Apache 服务。

如果你希望将来透过远端存取版本库时,一律使用 http://my-server/git/* 开头的 URL,则可将 ScriptAliasMatch 指令改为 "(?x)^/git/(.*/(HEAD | \ ……."

第四步:添加用户

下面,我们将向 htpassword 文件添加用户名和密码。这样,在我们提交版本是,Apache 服务器就可以根据这里我们指定的用户名和密码判断是否具有权限。

添加用户名和密码的操作应该使用 Apache 提供的 htpasswd 命令。使用命令提示符来到 Apache 安装目录下的 bin,输入命令:

htpasswd -cmb htpassword abc 123456

该命令执行后,会在当前目录下生成一个名为 htpassword 的文件,用户名为 abc,密码为 123456(加密的)。

htpasswd 命令还可以追加用户、修改用户密码、删除用户等,具体操作请查阅 htpasswd 使用手册。

第五步:测试

这里我们要建立一个测试库,以便查看我们的服务器是否能够正常运行。

我们使用 Git Bash,来到 C:/workspace 目录,运行如下命令:

git init --bare myapp.git

此时,会在 workspace 目录下建立一个空的版本库 myapp.git。然后我们运行

git clone http://localhost/myapp.git

此时,Git 会要求我们提供用户名和密码,之后就可以正常 clone。然后尝试修改文件,运行一下

git push origin master

在提供用户名和密码之后即可成功提交。

如果上面的命令都可以正常进行,则说明我们的服务器基本已经搭建完成。

30 评论

xeonwell 2011年10月12日 - 09:13

这个好, 感谢分享。
下面命令应该是加多一个-

git init --bare myapp.git

另外我在配置的时候, myapp.git要放在c:/workspace/git目录才行

回复
DevBean 2011年10月12日 - 11:29

的确是两个 - ,应该是页面显示的问题,所以看起来像是一个。
这个命令应该不需要放在 c:/workspace/git 的啊,会自动生成 myapp.git 目录的。之后的目录是 c:/workspace/myapp.git

回复
xeonwell 2011年10月12日 - 11:31

我的不行, 必须放到c:/workspace/git/myapp.git目录才行,放到你上面的目录,apache里面错误日志提示找不到c:/workspace/git/myapp.git这个目录

回复
DevBean 2011年10月12日 - 12:29

你是不是使用的是 http://my-server/git/* 这样的 URL 哦?如果是的话就应该有一层 git 这个目录了。否则的话就应该使用 http://my-server/* 这样的 URL。

回复
sooyoo 2011年12月16日 - 16:07

我是同样的问题,不知什么原因

回复
lean 2013年12月5日 - 22:00

你好,安装你的步骤我已经成功配置好了,但是我添加了用户之后,也显示成功,但是就是使用我添加的用户无法登陆,一直说验证失败。我重启过还是无效,请问这是什么原因,能帮我解决一下吗,非常感谢

回复
豆子 2013年12月8日 - 11:23

这个我也不大清楚,Windows 下配置的确很麻烦,问题比较多。不知道你是在本机还是远程测试的?会不会有防火墙的问题?

回复
patton88 2015年12月27日 - 23:19

AuthUserFile “C:/Program Files/Git/htpasswd”
应该改为AuthUserFile “C:/Program Files/Git/htpassword”,这作者笔误

回复
豆子 2015年12月28日 - 17:12

这个名字貌似不一致,很多系统上面都是 htpasswd,但是有些系统可能是 htpassword,这个名字可以自定义

patton88 2015年12月28日 - 17:23

主要是以下两处的文件名必须一致,否则登录验证时无法找到存放验证信息的文件,导致登录失败
htpasswd -cmb htpassword abc 123456
AuthUserFile “C:/Program Files/Git/htpasswd”

这一行中:htpasswd -cmb htpassword abc 123456,前面的htpasswd是命令名,后面的htpassword 是存放验证信息的文件名。存放验证信息的文件名必须与AuthUserFile 后面指定的文件名一致

patton88 2015年12月28日 - 17:29

我在安装中也遇到这个问题,将两处的文件名改为一致后,便能成功登录。文件名可以自定义,关键是两处要一致。文章中一处是htpasswd:
AuthUserFile “C:/Program Files/Git/htpasswd”

另一处是htpassword ,两处不同
htpasswd -cmb htpassword abc 123456

baibaiwei 2011年11月1日 - 15:28

谢谢分享
我在clone时提示
fatal:http://127.0.0.1/myapp.git/info/refs not found:did you run git update-server-info on the server?
不知道是什么原因

回复
DevBean 2011年11月1日 - 19:33

这个提示我也遇到过,尝试在 myapp.git 下运行一下 git update-server-info 看看如何。

回复
Kiwi 2012年8月7日 - 00:01

Dear DevBean

你好,我也遇到這問題
但是我執行git update-server-info後
檔案有出現,但是錯誤還是存在,搞好久
請問是否還有其他原因

麻煩了

回复
DevBean 2012年8月7日 - 13:36

这个问题经常出现,有可能是版本问题,因为 git 服务器在 Windows 下经常出现各种各样的问题,如果可能的话最好不要架设在 Windows 下吧。一开始我也遇到过这个问题,后来换过几个版本之后才莫名其妙的好了…这个很令人难受的…

回复
troy 2013年2月4日 - 22:24

在myapp.git目录下放置文件名为git-daemon-export-ok的文件能解决该问题。

coommissar 2012年5月7日 - 18:59

1.有可能是密码文件不可访问,将密码文件放到git库目录下,就C:/workspace这个目录下。
2.有可能是下面的地方写错了,我就是这个错误。

Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all

回复
lameck 2012年9月8日 - 21:37

SetEnv GIT_HTTP_EXPORT_ALL 1

回复
robot 2012年9月28日 - 16:27

我遇到了did you run git update-server-info on the server?这个问题,找了很多方法都没解决,后来在SetEnv GIT_HTTP_EXPORT_ALL这个后面加了个1就好了,请问这个后面那个1有什么特殊含义吗?

回复
DevBean 2012年9月28日 - 19:36

如果没有猜错的话,GIT_HTTP_EXPORT_ALL 1 应该是个标记位,设置 GIT_HTTP_EXPORT_ALL 打开。详情可以参阅 http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.html

回复
haishizi 2012年4月6日 - 14:54

我去掉中Require valid-user,能够git clone http://localhost/myapp.git,但不能git push origin master或者git pull origin master,fatal:Couldnot find remote ref master出错

回复
DevBean 2012年4月6日 - 16:19

实话说,在 Windows 上架设 git 服务器真的很痛苦的…还是放 Linux 吧

回复
haishizi 2012年4月6日 - 17:29

那是不是要很熟悉Linux,呵呵,我试试。

回复
haishizi 2012年4月10日 - 11:49

你好,我的在自己电脑上能push,clone,pull,fetch了,但局域网和外网怎么访问我的呀,我测试了把127.0.0.1改为我的IP地址,连接不上,不知道怎么回事,你是怎么让局域网和外网访问的呢?

回复
DevBean 2012年4月10日 - 14:34

局域网访问的话,使用本机在局域网的 IP 就可以了;外网的话,如果你有固定 IP,使用固定 IP 即可,如果没有哦,则需要使用类似“花生壳”的动态域名分析技术。(注意下防火墙的设置)

回复
haishizi 2012年4月10日 - 11:50

我还是在windows上试的

回复
coommissar 2012年5月7日 - 18:57

windows上真麻烦。
不过今天总算搞定了。

回复
swteen 2016年12月20日 - 16:44

您好,我按照你的步骤配置为完毕,一切正常,最后clone的时候提示fatal: unable to access 'http://localhost:8888/swteen.git/': The requested URL returned error: 500

回复
swteen 2016年12月20日 - 17:34

clone 的时候出现500错误,查看日志说是Could not open password file: C:/Program Files/Git/htpasswd,这个应该是权限问题,请问需要怎么样配置

回复
豆子 2016年12月25日 - 09:14

看错误应该是文件没有找到或者权限问题(不过一般是有读权限的),怀疑可能是路径中有空格的原因

回复

回复 lameck 取消回复

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2