0

我的用例是

  1. 我有一个由 uidA:gidA 创建的非常大的 GIT 存储库,其所有文件和 git 索引为 uidA:gidA
  2. 我已经使用 netapp 文件系统技术进行了快照/冻结,也就是冻结了该目录和 git 工作区的内容
  3. 我“文件系统克隆”了 uidB:gidB 的快照。它会立即使用快照的精确副本创建一个新工作区,每个文件/目录现在由 uidB:gidB 拥有 1 个差异。

当我执行“git status”时,它会强制更新索引,很可能是因为索引中的文件/对象存储为 uidA:gidA,而“文件系统克隆”工作区中的所有文件都归 uidB:gidB并且存在不匹配。

  1. 有没有办法有效地将索引中的部分或全部对象/文件更新为 uidB:gidB。我怀疑默认更新实际上会在更新索引之前检查每个文件,在这种情况下不需要。所以我想办法盲目地将索引中的所有文件更新为 uidB:gidB

  2. 或者避免强制索引更新。

在 NFS 上,在我们非常大的工作区中进行索引更新需要 20 多分钟。工作空间为 800GB

4

1 回答 1

1

Git 命令行工具不允许您在索引中更新此信息。但是,Git 确实提供了控制哪些数据存储在索引中的选项。

您可以设置core.checkstatminimal从索引中排除大量数据,包括 UID、GID、设备号和 inode 号。这通常包括在内,因为它是快速检测更改的好方法,但在您的情况下,您不希望这样。如果您的复制操作也没有保留 ctime,您可能还需要设置core.trustCtime为。false

但是请注意,在用户之间共享工作树是不安全的。任何可以修改原始工作树的用户都可以通过设置配置来像使用工作树或其副本的其他用户一样执行任意代码。因此,这是可以做到的,但它并不安全,除非您信任工作树的原始创建者在您的机器上执行任意代码。对不受信任的存储库做的唯一安全的事情是克隆或从中获取。

于 2021-09-03T22:27:55.297 回答