设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.13.7 → 2.52.0 无更改
-
2.12.5
2017-09-22
- 2.11.4 无更改
-
2.10.5
2017-09-22
- 2.3.10 → 2.9.5 无更改
-
2.2.3
2015-09-04
- 2.1.4 无更改
-
2.0.5
2014-12-17
描述
Git 与 CVS 的区别在于,每个工作副本都包含一个包含项目完整历史记录的仓库,并且没有哪个仓库比其他仓库更重要。然而,你可以通过指定一个供人们同步的共享仓库来模拟 CVS 模型;本文档解释了如何做到这一点。
需要具备一些基本的 Git 知识。看过 gittutorial[7] 和 gitglossary[7] 应该就足够了。
针对共享仓库进行开发
假设共享仓库已在 foo.com 主机上的 /pub/repo.git 设置好。那么作为个人提交者,你可以使用 ssh 克隆共享仓库:
$ git clone foo.com:/pub/repo.git/ my-project $ cd my-project
然后进行修改。cvs update 的等效操作是:
$ git pull origin
这将合并自克隆操作以来其他人可能已完成的工作。如果你的工作副本中有未提交的更改,请先提交它们,然后再运行 git pull。
|
注意
|
pull 命令知道从哪里获取更新,是因为第一个 git clone 命令设置的某些配置变量;有关详细信息,请参见 |
你可以通过先提交你的更改,然后使用 git push 命令将这些提交“推送”到共享仓库来更新共享仓库:
$ git push origin master
如果其他人更新了仓库(比你更新),git push 就像 cvs commit 一样,会报错,在这种情况下,你必须先拉取任何更改,然后才能再次尝试推送。
在上面的 git push 命令中,我们指定了要更新的远程分支的名称(master)。如果省略该名称,git push 会尝试更新远程仓库中与本地仓库中任何分支同名的分支。因此,最后的 push 可以使用以下任一命令完成:
$ git push origin $ git push foo.com:/pub/project.git/
只要共享仓库中除了 master 之外没有其他分支。
设置共享仓库
我们假设你已经为你的项目创建了一个 Git 仓库,可能是从头开始创建的,也可能是从 tarball 创建的(参见 gittutorial[7]),或者从已有的 CVS 仓库导入的(参见下一节)。
假设你现有的仓库位于 /home/alice/myproject。创建一个新的“裸”仓库(没有工作副本的仓库)并将你的项目提取到其中:
$ mkdir /pub/my-repo.git $ cd /pub/my-repo.git $ git --bare init --shared $ git --bare fetch /home/alice/myproject master:master
接下来,赋予每个团队成员对该仓库的读/写访问权限。一种简单的方法是让所有团队成员拥有托管仓库的机器的 ssh 访问权限。如果你不想让他们拥有机器上的完整 shell 权限,有一个受限 shell,只允许用户执行 Git pushes 和 pulls;参见 git-shell[1]。
将所有提交者放在同一个组中,并使该组可以写入该仓库:
$ chgrp -R $group /pub/my-repo.git
确保提交者的 umask 最多为 027,以便他们创建的目录对其他组成员是可写的和可搜索的。
导入 CVS 存档
|
注意
|
这些说明使用了 git 自带的 git-cvsimport 脚本,但其他导入器可能能提供更好的结果。有关其他选项,请参见 git-cvsimport[1] 中的注释。 |
首先,安装 cvsps 的 2.1 或更高版本,地址为 https://github.com/andreyvit/cvsps,并确保它在你的 PATH 中。然后 cd 到你感兴趣的项目的已签出的 CVS 工作副本目录,并运行 git-cvsimport[1]:
$ git cvsimport -C <destination> <module>
这会将名为 <destination> 的目录中的 CVS 模块的 Git 存档,如果该目录不存在,则会创建它。
导入会检查 CVS 中的每个文件的每个修订版。据报道,cvsimport 每秒平均可以处理约二十个修订版,因此对于中等规模的项目,这不应超过几分钟。大型项目或远程仓库可能需要更长时间。
主干存储在名为 origin 的 Git 分支中,其他 CVS 分支存储在同名的 Git 分支中。主干的最新版本也保留在 master 分支上签出,因此你可以立即开始添加自己的更改。
导入是增量的,所以如果你下个月再次调用它,它将获取在此期间所做的任何 CVS 更新。要使其正常工作,你不能修改导入的分支;而是为自己的更改创建新分支,并在需要时合并导入的分支。
如果你想要一个共享仓库,你需要按照上述说明制作一个导入目录的裸克隆。然后,为了合并增量导入,将导入的目录视为另一个开发克隆。
高级共享仓库管理
Git 允许你指定称为“钩子”的脚本,以便在特定点运行。你可以使用它们,例如,将所有提交到共享仓库的提交发送到邮件列表。参见 githooks[5]。
你可以使用更新钩子来强制执行更细粒度的权限。参见 通过更新钩子控制对分支的访问。
为 Git 仓库提供 CVS 访问
也可以为 Git 仓库提供真正的 CVS 访问,以便开发人员仍然可以使用 CVS;有关详细信息,请参见 git-cvsserver[1]。
替代开发模型
CVS 用户习惯于将一组开发人员的提交权限授予一个公共仓库。正如我们所见,这也适用于 Git。然而,Git 的分布式特性允许其他开发模型,你可能需要首先考虑其中一种是否更适合你的项目。
例如,你可以选择一个人来维护项目的主要公共仓库。其他开发人员然后克隆这个仓库,并在他们自己的克隆中工作。当他们有一系列令他们满意的更改时,他们会请求维护者从包含这些更改的分支进行拉取。维护者审查他们的更改并将它们拉取到主仓库中,其他开发人员根据需要拉取主仓库以保持同步。Linux 内核和其他项目使用该模型的变体。
对于一个小团队,开发人员可能只是从彼此的仓库中拉取更改,而无需中央维护者。