Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51003
  • 博文数量: 19
  • 博客积分: 387
  • 博客等级: 一等列兵
  • 技术积分: 176
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-01 16:53
文章分类
文章存档

2012年(2)

2011年(17)

我的朋友

分类: 项目管理

2012-04-27 21:40:02

提交流程大致如下

1
2
3
4
5
6
7
$ git clone git@10.123.4.212:/home/www/jolnet.git
#... 项目开发 ...
$ git add 改动的文件
$ git commit
$ git pull origin jol3.3 #分支名
#... 解决版本合并问题 ...
$ git push origin jol3.3:jol3.3 #本地分支和远程分支

这篇主要是记录我在 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 Files\Git。

由于我要让用户端可透过 HTTP 协定来存取版本库,因此还要把 Git 安装目录下的 bin\libiconv2.dll 复制到安装目录下的 libexec\git-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。找到标签,确认其设定如下:

1
2
3
4
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all

接着在 httpd.conf 的最后面加入以下文字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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″
AuthType Basic
AuthName ”GIT Repository”
AuthUserFile ”D:/GitRepos/htpasswd”
Require valid-user

其中第一道指令是告诉 Git 你的版本库放在哪里,第二道指令表示该目录下的所有版本库都可以透过 http(s) 的方式存取。第三道指令则是令 Apache 把 Git 相关 URL 导向给 Git 的 http 处理程序。注意:如果你的 Windows 系统是 64 位,里面的 C:/Program Files/…. 就要改一下。最后的区段设定了虚拟根路径 “/” 的验证规则,D:/GitRepos/htpassword 是账号密码文件。
完成上述修改之后,重启 Apache HTTP 服务。
Note: 如果你希望将来透过远端存取版本库时,一律使用 * 开头的 URL,则可将 ScriptAliasMatch 指令改为 “(?x)^/git/(.*/(HEAD | \ …….”

Step 3: 建立版本储存库

这里先建立一个测试用的版本库,以确认用户端可以透过 HTTP 协定取出档案。步骤如下:
1 开启 Git Bash 命令列视窗:开始 > 程序 > Git > Git Bash。
2 输入以下命令,以建立一个空的版本库(‘$’ 符号是提示字符,不用输入):

1
2
$ cd D:/GitRepos
$ git init MyProject

参考下图:

此范例的 git init 命令会在 MyProject 目录下建立一个名为「.git」的隐藏目录,Git 用来管理版本所需的控制档案全都放在这里。MyProject 这个目录本身则是工作目录,你可以在此目录下加入档案或子目录。
Note: 在初次建立一个可让多人共享的版本库时,应该要使用 git init –bare 命令。加上 –bare 的参数,表示要建立「单纯的」版本库,也就是不含任何工作复本(working copy)档案,而只包含版本控制相关的档案。
Note: 版本库的根目录(这里是 D:\GitRepos)之下的第一层子目录不必一定要建立成版本库。我们也可以在其下建立单纯的子目录,然后在各个子目录底下建立版本库。例如:

1
2
3
4
5
6
D:\GitRepos
+– Projects
+– PrjA (版本库)
+– PrjB (版本库)
+– Notes
+– DotNet (版本库)

这样的话,以后我们就可以用类似「」的网址来存取版本库。

Step 4: 取出版本库

比较正确的说法,是把版本库复制(clone)一份回自己家里(本机)。一样开启 Git Bash 视窗,切换到你打算存放本机版本库的目录,然后使用 git clone 把档案库拉回来。指令如下:

1
2
$ cd d:/Work
$ git clone

接着应该会要求你输入账号和密码,若输入正确,便可将本库取回。参考下图:

使用 git clone 命令时,网址也可以包含使用者账户名称,例如:

1
$ git clone

如果欲复制的远端版本库不是空的,Git 会先压缩档案再传送,而且在荧幕上显示压缩的进度,如下图:

下一步
后续的作业,就是在本机的工作目录下进行日常的档案修改与版本提交程序了。

Git 基础作业流程

1 建立一个共享的版本库。
2 将远端主机上的版本库复制一份至本机。
3 修改本机的工作复本,然后提交。
4 将提交的档案推送至远端主机的版本库。

以下是范例:
1. 建立一个共享的版本库

1
2
cd d:/GitRepos/Projects/MyProjectA
git init –bare

2. 将远端主机上的版本库复制一份至本机

1
git clone

如果你的 Git 服务器支援 https:// 协定,则复制版本库的指令会类似这样:

1
git clone

若以 https:// 协定复制版本库时出现错误:

1
2
3
4
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
fatal: HTTP request failed

可尝试以下列指令解决:

1
git config –global http.sslverify false

此外,你也可以在复制时直接指定账号密码,例如:

1
git clone

如果这个「远端主机」就是你目前工作的本机,即要在同一台机器上复制出另一个版本库,则可以用 file:// 。例如:

1
git clone file://d:/GitRepos/Projects/MyProjectA

没有加 file:// 或者写 file:///(三个斜线)也可以。
3. 修改本机的工作复本,然后提交

1
2
git add .
git commit -m "提交时的说明文字"

4. 将提交的档案推送至远端主机的版本库

1
git push origin master

其中的 push 代表要将变更推送至远端服务器;origin 代表此 local 版本库在远端服务器的来源,你可以从 local 版本库的 .git\config 档案中找到这个远端的 “origin”;最后的参数 master 则代表 master 分支。
所以上述指令的意思,以比较精确的解释来说,就是:将本机的 master 分支的所有变更推送至远端主机的 master 分支。
如果没有指定 master 分支,只写这样:

1
git push origin

则表示要将本机的所有分支的变更推送至远端主机的对应分支。
若要将本机的变更推送至远端版本库的其他分支,例如 feature101,就可以输入指令:

1
git push origin feature101

其他开发人员如果要取得最新的档案,可以在自己的 local 版本库的目录之下执行 git pull 命令。
以上大概就是最简单、最基础的 git 作业流程。

Git: push 出错的解决 master -> master (branch is currently checked out)

在使用Git Push代码到数据仓库时,提示如下错误:

1
2
3
4
5
6
7
8
9
10
[remote rejected] master -> master (branch is currently checked out)
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.
remote: error:
...
...
...

这是由于git默认拒绝了push操作,需要进行设置,修改.git/config添加如下代码:

1
2
3
[root@localhost .git]# vi config
    [receive]
    denyCurrentBranch = ignore

在初始化远程仓库时最好使用 git –bare init 而不要使用:git init

如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset –hard才能看到push后的内容.

from : 

阅读(2454) | 评论(0) | 转发(0) |
0

上一篇:Git使用

下一篇:没有了

给主人留下些什么吧!~~