/ 中存储网

Windows上搭建Apache+Git服务器

2013-08-31 02:04:06 来源:ITJS.CN

在公司一直使用 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 FilesGit。下面我们可以进入 C:Program FilesGitlibexecgit-core 目录,双击运行 git-http-backend.exe 程序。这个程序的作用就是处理 HTTP 请求。不过,有时你会得到一个错误:

这个错误是说缺少 libiconv-2.dll。该文件位于 C:Program FilesGitbin。我们可以将其从这里复制到 C:Program FilesGitlibexecgit-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 是账号密码文件,该文件可以在任何位置,也可以使任何名字,只要在这里指定即可。

如果将“Require valid-user”注释掉,就不需要密码认证了,在内网用时会很方便,但这是只允许pull,而不允许push。

完成上述修改之后,重启 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

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

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

ps

终于配好能用了,中间有挺多细节。在按照上面做时,自以为聪明,有的步骤路过了,如安装git后复制那个dll文件,如更改apache让所有人可以访问,这里我都用黄底标识出了。

人家的步骤就是那个样子,可你非要跳着看,在没有掌握的情况下,肯定会出错了。

这样配置好后,其实就可以用了。

git init 初始化git仓库

git add .

git commit -m"init"

然后从服务端

git clone http://192.168.0.145/工程的目录名

上面的过程是不好,还是文中测试的那个好。

试了也会知道,当你在修改代码后push时,会报错

remote: error: refusing to update checked out branch: refs/heads/master

remote: error: By default, updating the current branch in a non-bare repository

remote: error: is denied, because it will make the index and work tree inconsistent

remote: error: with what you pushed, and will require 'git reset --hard' to match

remote: error: the work tree to HEAD.

...

意思就是不要直接提交代码到non-bare仓库,因为可能这是别人的工作目录,显然不应该这样干,比如:有冲突,而别人又在开发不能处理冲突升级到你的代码。

所以在建立仓库时,用 git init --bare 来建立一个bare的仓库,bare即赤裸的意思,说明这个目录里面就是原来工作目录里.git里的内容。

这样之后,再往上push代码就ok了!

理也是这个理:仓库就是仓库,对所有人都是。

在服务器上建好仓库后,在本地一个已经git init 的工程目录下,直接

git push http://192.168.0.145/repo.git master

就把它push到了远程的master分支。这里的分支明是必须的,且需和本地的分支名相同,因为本地一般默认master,所以push到远端master分支。

So easy!