【问题标题】:Is it possible to remote count object and size of git repository?是否可以远程计算 git 存储库的对象和大小?
【发布时间】:2010-05-21 13:52:23
【问题描述】:

假设网络中的某个地方存在公共 git 存储库。我想克隆它,但首先我需要确定它的大小(git count-objects 中有多少对象和千字节)

有办法吗?

【问题讨论】:

  • @Dogbert 借助他们的 API,您可以了解 GitHub 托管存储库的大小(参见 SO question)。不过,我还没有找到与对象计数相关的任何内容。 Hth.

标签: git repository size


【解决方案1】:

您可以使用的一个小工具如下:

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”,你就知道你遇到了麻烦,你可以取消它。

【讨论】:

  • 您确定这是有效的吗?我认为百分比代表接收到的对象数量而不是数据大小。
  • 我并没有说这给了你任何确切的数字,只是你可以用它来判断存储库是否非常大。
  • 如果您想走这条路线,您可以运行git fetch --dry-run,然后您无需担心在数据传输之前取消。但你们都是对的,这是一个不完美的组合。
  • 我刚刚使用 --dry-run 进行了测试,它仍然下载包,我认为它只是没有更新任何磁头。
  • 显示的大小是针对已下载对象的数量。所以它更多是基于运气,取决于何时获取大对象......有时当我的运气不太好时,我得到这个...... 10%1MB......然后当100%时它是40或50MB。 (夸张的例子,但是这种感觉和震撼你要做好准备……)一般来说这种方法是有效的,因为 git 文件往往很小,所以你可以对大小进行线性猜测。好吧,至少 git 在下载时显示大小, hg clone 什么也没显示!我下载了一个大约 700MB 的水银回购协议,但永远不知道还有多少 % 要下载:S
【解决方案2】:

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

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
  • 如果你有jq,你可以直接得到大小:curl -s https://api.github.com/repos/git/git | jq '.size'
  • @Timo 查看更新的答案
【解决方案3】:

没有给出对象计数,但如果您使用 Google Chrome 浏览器并安装此extension

它将回购大小添加到主页:

【讨论】:

    【解决方案4】:

    我认为这个问题有几个问题:git count-objects 并不能真正代表存储库的大小(甚至 git count-object -v 不是真的);如果您使用的不是愚蠢的 http 传输,那么 制作时将为您的克隆创建新包;和(正如 VonC 指出的那样 out) 你为分析远程仓库所做的任何事情都不会考虑 工作副本大小。

    话虽如此,如果他们使用的是愚蠢的 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
    

    在这一切结束时,远程服务器将打包 master/HEAD 和 所有标签,你将下载整个包文件只是为了 看看在克隆过程中下载它会有多大。

    当您最终进行克隆时,工作副本也将被创建,因此 整个目录会比这些命令吐出来的大,但是打包文件 通常是具有重要历史记录的工作副本的最大部分。

    【讨论】:

      【解决方案5】:

      我不知道:
      Git 不是服务器,默认情况下不会监听请求(除非您激活 gitweb 或 gitolite 层)
      并且命令“git remote ...”处理远程仓库的本地副本(获取)。

      所以除非你获取一些东西,或者clone --bare 一个远程仓库(它不会签出文件,所以你只有 Git 数据库),你不会知道它的大小。
      这不包括工作目录的大小,一旦签出。

      【讨论】:

      • 您介意分享clone --bare 如何提供 OP 要求的信息吗?然后,您的答案可能会成为一个非常有趣且相关的答案。 (很好,Git 不是服务器。)
      • @XavierStuvw 当然,10 年后,我编辑了答案以阐明为什么裸存储库是获取所述存储库大小的好方法。
      猜你喜欢
      • 2020-02-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 2014-11-20
      • 2018-05-26
      相关资源
      最近更新 更多