我可以强制 git 保持离线状态吗?

Tav*_*nes 2 git

我想要一个没有文件内容的 git 存储库的裸浅克隆,因为我感兴趣的是文件路径本身。这很好用:

$ git clone --bare --depth=1 --filter=blob:none --branch="118.0.5977.1" "https://github.com/chromium/chromium.git"
Cloning into bare repository 'chromium.git'...
remote: Enumerating objects: 34624, done.
remote: Counting objects: 100% (34624/34624), done.
remote: Compressing objects: 100% (25673/25673), done.
remote: Total 34624 (delta 1647), reused 21869 (delta 1304), pack-reused 0
Receiving objects: 100% (34624/34624), 13.72 MiB | 16.20 MiB/s, done.
Resolving deltas: 100% (1647/1647), done.
Run Code Online (Sandbox Code Playgroud)

它在大约 3 秒内完成,并且仅占用磁盘上的 15 MiB。我可以通过 获取路径git ls-tree -r HEAD

然而,各种 git 命令似乎想要从远程存储库获取额外的数据。例如

$ cd chromium.git
$ git log
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 372 bytes | 372.00 KiB/s, done.
commit 58a2c380702a84b362d0ee74ffc1e53e937770dd (grafted, HEAD, tag: 118.0.5977.1)
...
Run Code Online (Sandbox Code Playgroud)

我可以告诉 git 不要这样做吗?我希望命令失败,而不是从远程获取任何附加数据。

Tav*_*nes 5

我在https://www.git-scm.com/docs/partial-clone/找到了相关文档。尤其,

  • 由于目前几乎所有 Git 代码都期望任何引用的对象都存在于本地,并且我们不想强制每个命令都先进行空运行,因此添加了一个回退机制,以允许 Git 尝试从承诺者远程动态获取丢失的对象。

    当正常的对象查找无法找到对象时,Git 会调用 promisor_remote_get_direct() 来尝试从 promisor 远程获取对象,然后重试对象查找。这使得对象无需复杂的预测算法就可以“出错”。

    出于效率原因,不检查丢失的对象是否实际上是承诺者对象。

    动态对象获取往往会很慢,因为一次只获取一个对象。

...

被视为“promisor”遥控器的遥控器是由以下配置变量指定的遥控器:

  • extensions.partialClone = <name>
  • remote.<name>.promisor = true
  • remote.<name>.partialCloneFilter = ...

因此,如果存在“promisor”远程,git 将自动从中获取丢失的对象。为了让它不成为承诺者,我所要做的就是

$ git config --unset remote.origin.promisor
$ git config --unset remote.origin.partialclonefilter
Run Code Online (Sandbox Code Playgroud)

现在它给出了我想要的错误:

$ git log
error: unable to read mailmap object at HEAD:.mailmap
commit 58a2c380702a84b362d0ee74ffc1e53e937770dd (grafted, HEAD, tag: 118.0.5977.1)
...
Run Code Online (Sandbox Code Playgroud)