如何在执行git pull时实时显示当前正在拉取的文件名?
问题说明
推测仓库内存在体积较大的二进制文件触发Github速率限制,但无法定位具体文件。执行git pull时默认仅展示如下进度计数,无法查看当前正在拉取的文件名:
Receiving objects: 36% (67/183), 668.00 KiB | 7.00 KiB/s
已尝试开启Git调试参数获取详细输出,仍然无法显示当前下载的具体文件名,使用的调试命令如下:
export GIT_TRACE_PACKET=1 export GIT_TRACE=1 export GIT_CURL_VERBOSE=1
原因说明
Git执行拉取操作时,传输的是打包后的pack格式文件,并非逐个独立传输单个文件。传输过程中本地Git还未完成对pack包内所有对象的解析,因此原生不支持实时显示当前传输的文件名。上述调试参数仅能打印网络交互、包传输元数据,无法输出包内单个文件的路径信息。
大文件定位方案
方案1:拉取中断后从本地临时pack文件排查
- 正常执行
git pull直到触发速率限制中断,不要手动清理本地Git临时对象 - 进入仓库下的
.git/objects/pack/目录,找到最新生成的后缀为.tmp的临时pack文件 - 执行以下命令列出该临时pack内所有对象,按体积从大到小排序:
git verify-pack -v .git/objects/pack/<替换为找到的临时pack文件名>.tmp | sort -k3 -n -r
- 复制输出结果中排在前列的大体积对象哈希值,执行以下命令反查对应的文件路径:
git rev-list --objects --all | grep <替换为大对象哈希值>
方案2:直接扫描仓库提交历史定位大文件
如果能拉取到部分仓库提交,直接执行以下命令,列出仓库历史中体积最大的前20个文件,无需等待拉取中断:
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort -n -k2 -r | head -n 20 | numfmt --field=2 --to=iec
输出结果第二列为文件体积,第四列及之后为对应文件路径,体积远超普通代码文件的二进制文件即为触发速率限制的目标。
方案3:浅拉取缩小排查范围
如果全量拉取一开始就会触发限制,可以先终止当前拉取任务,执行浅拉取仅获取最近1次提交:
git pull --depth=1
浅拉取成功后,逐步加大拉取深度,每次拉取后使用方案2的命令扫描本地对象,拉取失败时大文件就存在于刚拉取的提交区间内,可快速缩小定位范围。
注:不建议尝试通过抓包等方式实时解析传输中的文件名,这类方法稳定性极差,定位效率远低于上述方案。
内容的提问来源于stack exchange,提问作者rockstardev
相关产品推荐
相关产品推荐

