这篇主要是记录我在 Windows 平台安装 Git 的过程和git的简单使用。
先描述一下安装的需求:
· 用户端和服务器端的操作系统都是 Windows。
· 用户端要能透过 HTTP 的方式存取版本库。
· 无论是取出档案还是送交档案,都需要验证身分(输入账号密码)。
底下是安装步骤:
Step 1: 安装 Git for Windows
在 Windows 环境使用 Git,可以用 msysgit (Git for Windows),我安装的版本是 v1.7.4。装好之后,程序集里面会多出一个选单:Git,里面有两个程序:Git GUI 和 Git Bash。前者是图形操作界面,后者是命令列视窗。Git 的预设安装目录是c:Program FilesGit。
由于我要让用户端可透过 HTTP 协定来存取版本库,因此还要把 Git 安装目录下的 binlibiconv2.dll 复制到安装目录下的libexecgit-core 底下。少了这个动作,将来透过 HTTP 存取版本库时,就会出现 HTTP 500 Internal Server Error 的讯息。如下图所示:
Step 2: 安装 Apache HTTP Server
欲提供 HTTP 的存取方式,可以利用Apache Http Server。我安装的版本是 Apache 2.2.19(包含 OpenSSL)。
安装好 Apache 之后,修改 httpd.conf,令它使用 8080 port,以免和 IIS 抢 80 port。
接下来,一样是修改 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 D:/GitRepos
# 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 ”D:/GitRepos/htpasswd”
Require valid-user
</Location>
其中第一道指令是告诉 Git 你的版本库放在哪里,第二道指令表示该目录下的所有版本库都可以透过 http(s) 的方式存取。第三道指令则是令 Apache 把 Git 相关 URL 导向给 Git 的 http 处理程序。注意:如果你的 Windows 系统是 64 位,里面的C:/Program Files/…. 就要改一下。最后的 <Location> 区段设定了虚拟根路径 “/” 的验证规则,D:/GitRepos/htpassword 是账号密码文件。
完成上述修改之后,重启 Apache HTTP 服务。
Note: 如果你希望将来透过远端存取版本库时,一律使用 http://my-server/git/* 开头的 URL,则可将 ScriptAliasMatch 指令改为 “(?x)^/git/(.*/(HEAD | …….”
Step 3: 建立版本储存库
这里先建立一个测试用的版本库,以确认用户端可以透过 HTTP 协定取出档案。步骤如下:
1 开启 Git Bash 命令列视窗:开始 > 程序 > Git > Git Bash。
2 输入以下命令,以建立一个空的版本库(‘$’ 符号是提示字符,不用输入):
$ cd D:/GitRepos
$ git init MyProject
参考下图:
此范例的 git init 命令会在 MyProject 目录下建立一个名为「.git」的隐藏目录,Git 用来管理版本所需的控制档案全都放在这里。MyProject 这个目录本身则是工作目录,你可以在此目录下加入档案或子目录。
Note: 在初次建立一个可让多人共享的版本库时,应该要使用 git init –bare 命令。加上 –bare 的参数,表示要建立「单纯的」版本库,也就是不含任何工作复本(working copy)档案,而只包含版本控制相关的档案。
Note: 版本库的根目录(这里是 D:GitRepos)之下的第一层子目录不必一定要建立成版本库。我们也可以在其下建立单纯的子目录,然后在各个子目录底下建立版本库。例如:
D:GitRepos
+– Projects
+– PrjA (版本库)
+– PrjB (版本库)
+– Notes
+– DotNet (版本库)
这样的话,以后我们就可以用类似「http://my-server/Projects/PrjA」的网址来存取版本库。
Step 4: 取出版本库
比较正确的说法,是把版本库复制(clone)一份回自己家里(本机)。一样开启 Git Bash 视窗,切换到你打算存放本机版本库的目录,然后使用 git clone 把档案库拉回来。指令如下:
$ cd d:/Work
$ git clone http://localhost:8080/MyProject
接着应该会要求你输入账号和密码,若输入正确,便可将本库取回。参考下图:
使用 git clone 命令时,网址也可以包含使用者账户名称,例如:
$ git clone http://michael@localhost:8080/MyProject
如果欲复制的远端版本库不是空的,Git 会先压缩档案再传送,而且在荧幕上显示压缩的进度,如下图:
下一步
后续的作业,就是在本机的工作目录下进行日常的档案修改与版本提交程序了。
Git 基础作业流程
1 建立一个共享的版本库。
2 将远端主机上的版本库复制一份至本机。
3 修改本机的工作复本,然后提交。
4 将提交的档案推送至远端主机的版本库。
以下是范例:
1. 建立一个共享的版本库
cd d:/GitRepos/Projects/MyProjectA
git init –bare
2. 将远端主机上的版本库复制一份至本机
git clone http://my-server:8080/Projects/MyProjectA
如果你的 Git 服务器支援 https:// 协定,则复制版本库的指令会类似这样:
git clone https://my-server/Projects/MyProjectA
若以 https:// 协定复制版本库时出现错误:
error: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify faile
d while accessing https://localhost/Projects/test/info/refs
fatal: HTTP request failed
可尝试以下列指令解决:
git config –global http.sslverify false
此外,你也可以在复制时直接指定账号密码,例如:
git clone https://michael:guesswhat@my-server/Projects/MyProjectA
如果这个「远端主机」就是你目前工作的本机,即要在同一台机器上复制出另一个版本库,则可以用 file:// 。例如:
git clone file://d:/GitRepos/Projects/MyProjectA
没有加 file:// 或者写 file:///(三个斜线)也可以。
3. 修改本机的工作复本,然后提交
git add .
git commit -m ”提交时的说明文字“
4. 将提交的档案推送至远端主机的版本库
git push origin master
其中的 push 代表要将变更推送至远端服务器;origin 代表此 local 版本库在远端服务器的来源,你可以从 local 版本库的.gitconfig 档案中找到这个远端的 “origin”;最后的参数 master 则代表 master 分支。
所以上述指令的意思,以比较精确的解释来说,就是:将本机的 master 分支的所有变更推送至远端主机的 master 分支。
如果没有指定 master 分支,只写这样:
git push origin
则表示要将本机的所有分支的变更推送至远端主机的对应分支。
若要将本机的变更推送至远端版本库的其他分支,例如 feature101,就可以输入指令:
git push origin feature101
其他开发人员如果要取得最新的档案,可以在自己的 local 版本库的目录之下执行 git pull 命令。
以上大概就是最简单、最基础的 git 作业流程。