是否有办法在不克隆公共 Git 存储库的情况下估算其大小?
我想使用这些信息来确保存储库的大小小于某个特定大小。如果超过了这个大小,我就不想克隆它。
我知道 Github 上可以做到这一点,但是这个存储库托管在专用服务器上。
是否有办法在不克隆公共 Git 存储库的情况下估算其大小?
我想使用这些信息来确保存储库的大小小于某个特定大小。如果超过了这个大小,我就不想克隆它。
我知道 Github 上可以做到这一点,但是这个存储库托管在专用服务器上。
简短回答:"不需要"。
如果空间是一个问题,将存储库克隆到您可用的最大空闲空间中,如果它足够小以便放在其他地方移动它将很便宜。
获取它的一种非常粗暴的方法:将此代码放入服务器上的post-receive hook中。
git for-each-ref refs/size | while read . . ref; do git update-ref --delete $ref; done
set -- $(du -sh .git/objects)
git update-ref refs/size/$1-as-of-$(date +%Y%m%dT%H%M%S%Z) HEAD
您只需使用ls-remote命令即可查看它。
简短回答:嗯……也许。
详细回答:有一些启发式方法,您可以使用Git传输协议来获取一些信息。
我的个人观察是,在大多数基于文本的项目中,即使是非常古老的项目,.git大小也很少超过检出大小。
提取info/refs
将告诉您存储库中有多少个标签和分支。
提取objects/info/packs
将告诉您该项目具有哪些打包文件。然后,您可以在objects/pack/pack-WHATEVERTHEIDIS.pack
上进行HEAD请求(假设它是HTTP),以查看包文件的大小。这将为存储库大小提供一个下限。
如果磁盘空间是问题(磁盘很便宜,请购买新磁盘),您可以执行git clone --bare
以节省检出空间。然后,您可以克隆该本地的裸版本以获得完整的检出。
最后,如果您足够聪明,您可以遍历对象树,执行HEAD请求以获取每个对象的大小,并在接收到标头后取消对象GET(忽略数据部分)。这将为您提供存储库的大小,而无需下载整个存储库。
ssh
登录服务器并执行du
命令吗? - user554546ssh
登录它。 - PJ Bergeron