我公司的SVN代码库在下载时大约250MB。随着多年的变化,它可能相当大(4X 那个大小)。如果我们将所有这些都转移到 GitHub,每个用户是否必须下载 250MB 或者他们必须下载 1GB 或更多才能获得存储库的完整历史记录?
3 回答
您可以在没有历史记录的情况下进行克隆: git clone --depth 1 your_repo_url (请参阅https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_do_a_quick_clone_without_history_revisions.3F)
如果我们将所有这些都转移到 GitHub,每个用户是否必须下载 250MB 或者他们必须下载 1GB 或更多才能获得存储库的完整历史记录?
每个用户在第一次克隆时都必须检索整个存储库。但是,git 服务器端实现会将存储库的“压缩”版本作为packfile 发送。因此传输的数据的重量将远小于 1Gb。
每个连续的 fetch/pull 操作只会检索服务器知道的并且不在客户端本地存储库中的新 git 对象(提交、树和 Blob)。这些也将作为packfile通过网络发送。
尽管@akonsu 在声明您可以克隆存储库的浅版本(即没有整个历史记录)时是正确的,但这会阻止用户进一步与 GitHub 托管的主要上游存储库进行交互。
事实上,git clone文档指出:“浅层存储库有许多限制(你不能克隆或从中获取,也不能从中推送或进入)”
如果有很多文件的很多版本,您的对象数据库将随着时间的推移变得越来越大。
默认情况下,git 使用 zlib 压缩算法来存储单个 blob。但是可以告诉 git 将多个对象合并到一个包文件中,这也使用了 delta 压缩方法来节省空间。您的整个历史记录仍然存在,解包只需要比基于先前状态执行命令(例如检查旧版本)更长的时间。但我需要强调这是多么小。老实说,不到一秒钟的增加。
progit 书中有关 packfiles 的更多信息:http: //git-scm.com/book/en/Git-Internals-Packfiles