能否远程计数git仓库中的对象数量和大小?

55
假设在互联网上存在一个公共的 Git 代码仓库,我想要克隆它,但是首先必须确认它的大小(包含多少个对象和千字节,就像使用 git count-objects 命令一样)。有没有什么方法可以做到这一点?

3
你可以通过GitHub的API(见此SO问题)了解GitHub托管存储库的大小。不过,我还没有找到任何与对象计数相关的内容。希望这能帮到你。 - nulltoken
5个回答

24

你可以使用一个小技巧,如下所示:

mkdir repo-name
cd repo-name
git init
git remote add origin <URL of remote>
git fetch origin

git fetch 显示以下类似内容的反馈信息:

remote: Counting objects: 95815, done.
remote: Compressing objects: 100% (25006/25006), done.
remote: Total 95815 (delta 69568), reused 95445 (delta 69317)
Receiving objects: 100% (95815/95815), 18.48 MiB | 16.84 MiB/s, done.
...

远程端的步骤通常会非常快,而接收端可能会花费很长时间。它实际上并没有显示总大小,但你可以观察一秒钟,如果你看到"1% ... 23.75 GiB",那么你知道出现了问题,可以取消操作。


8
你确定这个有效吗?我认为这个百分比代表接收到的对象数量而不是数据大小。 - jhabbott
1
我并没有说这会给你任何确切的数字,只是你可以用它来判断存储库是否过于庞大。 - Cascabel
4
如果你想选择这个方法,你可以只运行“git fetch --dry-run”,这样你就不必担心在数据传输之前取消了。但你们两个都是对的,这只是一个不完美的权宜之计。 - bryan kennedy
1
我刚刚使用 --dry-run 运行了一个测试,它仍然下载了包,我认为它只是不更新任何头部。 - Xentac
所显示的大小是已下载对象的数量。因此,它更多地基于运气,取决于何时获取大对象...有时当我的运气不太好时,我会得到这个... 10% 1MB...然后当100%时,它是40或50MB。(夸张的例子,但这就是你必须为之准备的那种感觉和震惊...)通常这种方法适用于git文件往往很小,因此您可以线性猜测大小。至少git在下载时显示大小,hg clone什么也不显示!我下载了一个Mercury repo ~700MB,从未能知道还剩下多少%要下载:S - ken
我不想克隆它,但想知道它的大小。 - lindexi

19

[2021年9月21日更新]
看起来链接现在将被重定向到另一个URL,因此我们需要将-L添加到curl中以跟随重定向。

curl -sL https://api.github.com/repos/Marijnh/CodeMirror | grep size


[旧答案]
对于Github仓库,它现在提供了API以检查文件大小。 它有效!

这个链接:see-the-size-of-a-github-repo-before-cloning-it 给出了答案。

命令:(@VMTrooper的答案)

curl https://api.github.com/repos/$2/$3 | grep size

例子:

curl https://api.github.com/repos/Marijnh/CodeMirror | grep size
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100  5005  100  5005    0     0   2656      0  0:00:01  0:00:01 --:--:--  2779
"size": 28589,

没成功,我想检查一下https://github.com/madhur/PortableJekyll,但它很快就停止了,显示Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 140k 0 140k 0 0 155k 0 --:--:-- --:--:-- --:--:-- 155k - Timo
1
如果您有 jq,您可以直接获取大小:curl -s https://api.github.com/repos/git/git | jq '.size' - philb
@Timo,请查看更新后的答案。 - ken

10

没有给出对象数量,但如果您使用Google Chrome浏览器并安装了这个扩展程序

它会将存储库大小添加到主页中:

GitHub Repo Size extension screenshot


3
我认为这个问题存在一些问题:git count-objects并不能真正代表存储库的大小(即使使用git count-object -v也不是真正的); 如果您使用的是除了愚蠢的http传输以外的任何东西,当您创建克隆时,将为其创建一个新的包;而且(正如VonC指出的那样),您对分析远程存储库所做的任何事情都不会考虑工作副本的大小。
话虽如此,如果他们正在使用愚蠢的http传输(例如github),则可以编写一个shell脚本,使用curl查询所有对象和包的大小。这可能会让你更接近目标,但它会产生更多的http请求,你只需再次进行克隆即可。
可以通过类似以下步骤来实现此效果:确定git-fetch将通过线路发送的内容(到智能http传输),然后发送以分析结果,但这并不是一件好事。实质上,您正在要求目标服务器打包您将下载并丢弃的结果,以便您可以再次下载并保存它们。
类似于以下步骤可以用于此目的:
url=https://github.com/gitster/git.git
git ls-remote $url |
  grep '[[:space:]]\(HEAD\|refs/heads/master\|refs/tags\)' |
  grep -v '\^{}$' | awk '{print "0032want " $1}' > binarydata
echo 00000009done >> binarydata
curl -s -X POST --data-binary @binarydata \
  -H "Content-Type: application/x-git-upload-pack-request" \
  -H "Accept-Encoding: deflate, gzip" \
  -H "Accept: application/x-git-upload-pack-result" \
  -A "git/1.7.9" $url/git-upload-pack | wc -c

在所有这些完成之后,远程服务器将为您打包主分支/HEAD和所有标签,并下载整个包文件,以便在克隆期间下载它时查看其大小。
最终进行克隆时,工作副本也会被创建,因此整个目录会比这些命令所显示的更大,但通常情况下,带有任何重要历史记录的工作副本中最大的部分是包文件。

2
我不知道:
Git不是服务器,除非您激活gitweb或gitolite层,否则默认情况下没有任何东西监听请求。
命令“git remote ...”处理远程库的本地副本(已获取)。
因此,除非您获取某些内容或clone --bare一个远程存储库(它不会检出文件,因此您只有Git数据库),否则您将无法了解其大小。
这还不包括一旦检出后的工作目录的大小。

你介意分享一下 clone --bare 如何提供 OP 所请求的信息吗?这样,你的回答就会变得非常有趣和相关了。(很好的一点是 Git 不是一个服务器。) - XavierStuvw
@XavierStuvw 当然可以,十年过后,我已编辑答案以澄清为什么裸仓库是获取该仓库大小的好方法。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接