设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
修补
调试
电子邮件
外部系统
服务器管理
指南
管理
管道命令
- 2.13.7 → 2.47.0 无更改
- 2.12.5 09/22/17
- 2.11.4 无更改
- 2.10.5 09/22/17
- 2.3.10 → 2.9.5 无更改
- 2.2.3 09/04/15
- 2.1.4 无更改
- 2.0.5 12/17/14
描述
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 存储库导入的(请参阅下一节)。
假设您现有的 repo 位于 /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 平均每秒可以处理大约 20 个修订版,因此对于中型项目,这应该不会花费超过几分钟。大型项目或远程存储库可能需要更长的时间。
主干存储在名为 origin
的 Git 分支中,其他 CVS 分支存储在具有相同名称的 Git 分支中。最新版本的程序主干也保留在 master
分支上,因此您可以立即开始添加自己的更改。
导入是增量的,因此如果您下个月再次调用它,它将获取在此期间进行的任何 CVS 更新。为了使此功能正常工作,您不得修改导入的分支;相反,为自己的更改创建新分支,并在必要时合并导入的分支。
如果需要共享存储库,则需要创建导入目录的裸克隆,如上所述。然后将导入目录视为另一个开发克隆,用于合并增量导入。
高级共享存储库管理
Git 允许您指定在某些点运行的称为“钩子”的脚本。例如,您可以使用它们将所有提交到共享存储库的提交发送到邮件列表。请参阅 githooks[5]。
您可以使用更新钩子实施更细粒度的权限。请参阅 使用更新钩子控制对分支的访问。
为 Git 存储库提供 CVS 访问权限
还可以为 Git 存储库提供真正的 CVS 访问权限,以便开发人员仍然可以使用 CVS;有关详细信息,请参阅 git-cvsserver[1]。
替代开发模型
CVS 用户习惯于授予一组开发人员对公共存储库的提交访问权限。正如我们所见,Git 也支持此功能。但是,Git 的分布式特性允许其他开发模型,并且您可能需要首先考虑其中一个是否更适合您的项目。
例如,您可以选择一个人来维护项目的首要公共存储库。然后,其他开发人员克隆此存储库,并在各自的克隆中工作。当他们有一系列他们满意的更改时,他们会要求维护者从包含这些更改的分支中拉取。维护者会审查他们的更改,并将它们拉取到主存储库中,其他开发人员会根据需要从中拉取以保持协调。Linux 内核和其他项目使用此模型的变体。
对于小型团队,开发人员可能只需要从彼此的存储库中拉取更改,而无需中央维护者。
GIT
git[1] 套件的一部分