4

当使用git fetch从一个(非常大的)存储库获取引用到本地计算机上的另一个存储库git upload-pack时,创建包文件需要很长时间。在本地情况下,不需要最小化传输的数据量,而且我不关心因丢失增量压缩而丢失的磁盘空间,所以理想情况下,我更喜欢复制丢失的对象而不是打包然后进口的。有没有办法告诉git fetch在使用本地传输时只复制丢失的对象?

或者,更一般地说,有没有办法在全局范围内抑制包文件的生成?真的,我只是想将 git 用作一个版本化的文件系统,它不会为相同的文件占用额外的空间——打包和重新打包似乎是一个耗时的步骤,这使得这很尴尬。

顺便说一句,我花了一些时间尝试优化配置选项,以便重新打包不会花费很长时间(也不会开始颠簸)所以我认为答案不是“使用这些配置选项并且打包会更快” - 但是,也许我错了,所以为了清楚起见,我通常使用的配置选项(在使用 2 GiB RAM 的情况下)是:

core.deltacachesize=1
core.packedgitwindowsize=16m
core.packedgitlimit=128m
pack.packsizelimit=512m
pack.windowmemory=200m
pack.deltacachesize=200m
pack.window=4
pack.compression=3
pack.threads=0
gc.auto=0
gc.pruneexpire=never
receive.autogc=false
4

3 回答 3

2

我有一个普通的旧版本git clone不会克隆的存储库:

$ git clone $url
Cloning into foo...
remote: Counting objects: 6142, done.
error: pack-objects died of signal 9839/6058)   
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

虽然它被它覆盖的进度文本隐藏,但失败的错误消息是error: pack-objects died of signal 9.

我能够通过在客户端禁用打包来防止错误。我通过发出一系列命令(使用 git 1.7.4.1 发出)来做到这一点,这些命令基本上做了什么,但是在运行之前设置了git clone一个额外的命令。pack.depth0git fetch

mkdir foo
cd foo
git init
git remote add origin $url
git config pack.depth 0
git fetch origin
git branch --set-upstream origin origin/master
git checkout master
于 2011-03-24T15:50:44.687 回答
2

或许你可以使用alternates替代对象存储)机制;这将允许与其他本地存储库共享对象数据库,然后不必打包它们。

要设置它,如果从本地存储库克隆,或者如果从远程存储库克隆但在本地有类似的存储库,或者只是编辑文件,请使用“ git clone ” 。--shared--reference <repository>.git/objects/info/alternates

于 2010-07-26T11:24:28.980 回答
0

也许(未经测试)http-backend为您的第一个仓库(您从中获取的仓库)设置一个。

这种服务器的设置可能对您的情况感兴趣:

http.uploadpack

这服务git fetch-packgit ls-remote客户。
默认情况下启用它,但存储库可以通过将此配置项设置为 false 来禁用它。

于 2010-07-26T08:22:03.243 回答