设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.13.7 → 2.50.1 无变化
-
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 推送和拉取;请参见 git-shell[1]。
将所有提交者放在同一个组中,并使该仓库对该组可写:
$ chgrp -R $group /pub/my-repo.git
确保提交者的 umask 最大为 027,以便他们创建的目录可被其他组成员写入和搜索。
导入 CVS 归档
注意
|
这些说明使用 Git 附带的 git-cvsimport 脚本,但其他导入器可能会提供更好的结果。有关其他选项,请参见 git-cvsimport[1] 中的注释。 |
首先,从 https://github.com/andreyvit/cvsps 安装 2.1 或更高版本的 cvsps,并确保它在您的路径中。然后 cd 到您感兴趣的项目的已签出 CVS 工作目录中,并运行 git-cvsimport[1]:
$ git cvsimport -C <destination> <module>
这将把指定 CVS 模块的 Git 归档文件放入 <destination> 目录中,如果需要,该目录将被创建。
导入会从 CVS 中检出每个文件的每个版本。据报道,cvsimport 平均每秒可以处理大约二十个版本,因此对于一个中等规模的项目,这应该不会超过几分钟。大型项目或远程仓库可能需要更长时间。
主干存储在名为 origin
的 Git 分支中,其他 CVS 分支存储在同名的 Git 分支中。主干的最新版本也保留在 master
分支上,因此您可以立即开始添加自己的更改。
导入是增量的,因此如果您下个月再次调用它,它将获取在此期间已进行的任何 CVS 更新。为了实现这一点,您不得修改导入的分支;相反,为您的更改创建新分支,并根据需要合并导入的分支。
如果您想要一个共享仓库,您将需要如上所述对导入的目录进行裸克隆。然后将导入的目录视为用于合并增量导入的另一个开发克隆。
高级共享仓库管理
Git 允许您指定在特定点运行的名为“钩子”的脚本。例如,您可以使用这些脚本将所有提交发送到共享仓库到邮件列表。请参见 githooks[5]。
您可以使用更新钩子强制执行更细粒度的权限。请参见 使用更新钩子控制分支访问。
为 Git 仓库提供 CVS 访问
也可以为 Git 仓库提供真正的 CVS 访问,以便开发人员仍然可以使用 CVS;有关详细信息,请参见 git-cvsserver[1]。
替代开发模型
CVS 用户习惯于让一组开发人员拥有对公共仓库的提交访问权限。正如我们所看到的,Git 也可以实现这一点。然而,Git 的分布式特性允许其他开发模型,您可能需要首先考虑其中之一是否更适合您的项目。
例如,您可以选择一个人来维护项目的主要公共仓库。其他开发人员克隆此仓库并在他们自己的克隆中工作。当他们有一系列满意的更改时,他们会要求维护者从包含更改的分支中拉取。维护者审查他们的更改并将其拉取到主仓库中,其他开发人员根据需要从主仓库拉取以保持协调。Linux 内核和其他项目使用此模型的变体。
对于小团队,开发人员可以直接从彼此的仓库中拉取更改,而无需中央维护者。