【问题标题】:Git clone verbose mode – show each incoming objectGit 克隆详细模式 - 显示每个传入的对象
【发布时间】:2013-07-10 02:46:43
【问题描述】:

我想知道git clone --verbose 不是很冗长。执行命令的输出如下:

$ git clone --verbose <repo>
remote: Counting objects: 184, done
remote: Finding sources: 100% (184/184)
remote: Total 184 (delta 66), reused 183 (delta 66)
Receiving objects: 100% (184/184), 18.90 KiB, done.
Resolving deltas: 100% (66/66), done. 

预期的行为是一一查看接收到的对象的列表。是否可以使用其他选项?

【问题讨论】:

  • 有趣的事实 - 如果 git 确实按照您的建议逐个报告每个对象,那么 Linux 内核存储库的 git clone 将产生超过 200 万行的输出。可能是它没有以这种方式实现的一个很好的理由......如果你真的想要这些信息,你可以试试git rev-list --objects --all...
  • 我明白了,你知道“git rev-list --objects --all”提供的对象顺序与“接收对象”的“git clone”相同吗?我需要它,因为我有时会在接收其中一个对象时遇到网络错误,我想在树中准确地找到这个对象。
  • 如果您的“网络错误”与当前通过 TCP 套接字传输的特定对象有任何关联,我会感到非常惊讶。顺序可能不一样,因为git 正在生成并发送一个包含请求对象的包文件,而将订单对象放入包文件中似乎有些随意。
  • 在这种情况下,git如何确定已经下载了多少对象?在“接收对象”中,它会写入已下载对象的确切数量。
  • 客户端本质上运行git rev-list --objects --all(在初始克隆时为空)并将该列表发送到服务器。服务器根据它的存储库生成一个类似的列表,并减去客户端已经拥有的东西,然后根据列表中剩下的东西生成一个包文件——客户端还没有的东西。但是,生成包文件可以重新排序该列表,以尽量减小包文件的大小。

标签: git verbose


【解决方案1】:

我接受@Lekensteyn 的回答。

如果您想跟踪 git 远程命令,请将以下环境变量添加到您的终端中。这有助于您查看 git 命令幕后运行的内容。

export GIT_TRACE_PACKET=1
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1

参考:https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

导出后的样本克隆结果

【讨论】:

    【解决方案2】:

    不可能一个一个地列出对象(文件、提交、blob 等等),因为 git 出于效率原因将它们打包在一个文件中。出于同样的原因,您在克隆时只会看到一个隐藏的.git 文件夹,只有在下载完整包文件后才会创建文件。

    如果您想知道,这些包文件将下载到.git/objects/pack/,名称类似于tmp_pack_XXXXXX。 (稍后,它将被重命名为 pack-*.pack 以及相关的 pack-*.idx 文件)

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多