git 提交所花费的时间是否取决于文件大小?另外,在 git 中恢复以前的版本需要多少时间?

Is the time taken to git commit dependent on file size? Also, how much time does it take to restore a previous version in git?

执行 git 提交是否有固定的时间长度,还是取决于我们要提交的文件?另外,git 恢复以前的版本需要多少时间?

git commit 命令写入一些 tree 对象和一个 commit 对象,然后存储一个提交对象的哈希ID 进入当前分支。树对象集由 index 的内容决定。您可以直接使用git ls-files --stage.

查看这些内容

写入每个对象所需的时间通常非常短,因此在大多数情况下,git commit 几乎是瞬间完成的。所需树对象的数量取决于索引内容所需的子树数量。这很难简单地计算出来。检查索引中文件名中斜杠的数量是一个开始,但如果索引包含文件 a/ba/c 等等直到 a/z,那只是一个子树 ( for a/) 所有这些文件。如果索引包含 a/b/ca/c/d,则 b/ 有一个子树,没有 a/c/ 有一个子树,加上 a/ 本身的树,这使得总共三棵树。因此,仅仅计算斜杠就会高估,有时甚至会高估,这取决于每个子树的填充程度。

请注意,文件本身 在您 运行 git commit。如果您检查 git ls-files --stage 输出,您会看到每个文件都有一个丑陋的大哈希 ID。该哈希 ID 表示 blob 对象,该对象已将文件内容存储在存储库中。 git commit命令仅引用现有内容:无需编写新文件。

(将文件从存储库中复制出来所花费的时间,从其特殊的压缩 Git-only 格式到磁盘上的普通格式,大致与文件的大小成正比。复制一个文件所花费的时间在 git add 期间,文件从磁盘上的普通形式进入存储库的速度也大致与文件的大小成正比。但是一旦进入,提交 文件速度非常快。切换到另一个具有相同版本文件的提交不需要时间,因为 Git 注意到索引和工作树中的文件与目标提交中的文件匹配。切换到具有 不同 版本的文件需要从提交和索引中提取文件,进入工作树,属于 "copy out of repository to ordinary form" 情况。)