2010-02-01

Subversion 用户眼中的 Git (5): 没有部分检出

Subversion 可以将整个库检出到工作区,也可以将某个目录检出到工作区。对于要使用一个庞大、臃肿的版本库的用户,部分检出是非常方便和实际的。 但是 Git 只能全部检出,不支持按照目录进行部分检出。 那么这是为什么呢? —— Subversion 用户问道。

Git 的确没有部分检出,这并不是说只有将整个库克隆下来才能查看文件。有很多 git 工具,提供直接浏览git库的功能,例如 gitweb, trac 的 git 版本库浏览, redmine 的 git 版本库浏览。

Git 为什么没有部分检出?

Git 以及其他分布式版本控制工具,据我所知,都没有实现部分检出的功能,至少没有实现如下的部分检出: 想像中的完美版本控制系统(但并不存在):
  • 可以对一个大的版本库(分布式)进行部分检出,检出的也是一个独立的小版本库(分布式)
  • 小的版本库也可以被克隆
  • 小的版本库中的提交可以 PUSH 到大的版本库中
  • 小的版本库可以从大的版本库 PULL 相应目录的改动内容
这种版本控制系统不能在分布式版本控制系统中实现,我认为:
  • 大的版本库和部分检出的小的版本库,无法保证提交ID的一致性 因为分布式版本控制系统的提交ID是整个提交信息的SHA1哈希值,大版本库的提交经过裁减——部分检出后,内容变了,提交 ID 也应该改变才对。
  • 因为大的版本库和小的版本库(部分检出)的提交ID不一致,导致两个版本库的 PULL 和 PUSH 无法操作 即不知道哪些提交相互对应,造成两个版本库间的PULL和PUSH无法进行
  • 分布式版本控制系统中,提交作为一个整体存在,一个提交由于部分检出而人为分拆,造成混乱,如何合并呢?

Git 为什么没有必要实现 svn export 的功能?

Subversion 有一条命令:svn export ,可以将 subversion 版本库的一个目录下所有内容导出到指定的目录下。而 git 却无法找到类似命令。为什么呢?
  • Subversion 需要 svn export 命令是因为该命令可以导出一个干净的目录,即不包含 .svn 目录(包含配置文件和文件原始拷贝)
  • Git 只在根目录存在一个 .git 目录,此外在各个子目录下不再有任何控制目录存在,因此无须通过另外的命令导出一个纯粹的干净的原始文件目录
  • 只需要用系统提供的文件/目录拷贝命令,即可以实现将干净的目录复制到指定的目录中

Git-submodule 可以实现版本库的模块化

如果说 git submodule 和部分检出的相似性,还不如说 git submodule 就是 svn:externals 翻版。 就是说 git submodule 可以将各个小的 git 版本库集合为一个大的版本库。如果不需要整个大的版本库的话,可以仅仅克隆某个小的 git 库。

Git-svn:集合 svn 的部分检出和 git 的便利

Git-svn 是 Subversion 的最佳伴侣,可以用 Git 来操作 Subversion 版本库。这带来一个非常有意思的副产品——部分检出:
  • 可以用 git-svn 来对 Subversion 代码库的任何目录进行克隆,克隆出来的是一个git版本库
  • 可以在部分克隆的版本库中用 Git 进行本地提交
  • 部分克隆版本库中的本地提交可以提交到上游 Subversion 版本库的相应目录中
blog comments powered by Disqus