为什么git签出--分离速度慢?

为什么git签出--分离速度慢?,git,Git,git checkout-detach需要做什么吗?有时,当我在我们的大型代码库上运行它时,它会运行5秒钟,有时会运行一分钟以上。我不确定是什么影响了时差。但是,它究竟做了什么需要时间呢?正如有点间接地说的: 您可以省略,在这种情况下,命令将退化为 查看当前分支,这是一个带有 只显示跟踪的昂贵副作用 当前分支的信息(如果存在) 在您的特定情况下,由于-detach,它毕竟不是一个不可用的方法,但它仍然会产生相当昂贵的副作用部分 在内部,Git正在遍历当前提交和新提交,它假定这两个提交不同;在这种

git checkout-detach需要做什么吗?有时,当我在我们的大型代码库上运行它时,它会运行5秒钟,有时会运行一分钟以上。我不确定是什么影响了时差。但是,它究竟做了什么需要时间呢?

正如有点间接地说的:

您可以省略,在这种情况下,命令将退化为 查看当前分支,这是一个带有 只显示跟踪的昂贵副作用 当前分支的信息(如果存在)

在您的特定情况下,由于-detach,它毕竟不是一个不可用的方法,但它仍然会产生相当昂贵的副作用部分

在内部,Git正在遍历当前提交和新提交,它假定这两个提交不同;在这种情况下,这种假设是错误的。无论这些提交的树在哪里不同,都必须对索引和工作树文件进行更改。这种更改在某些情况下是不允许的,这将中止git签出并保持所有内容不变。有关详细信息,请参阅,但请注意,由于树匹配是因为提交匹配,所以树不同的位置大小写始终为false:它们始终匹配

尽管树匹配,但它仍然会比较索引和工作树文件,以便像输出一样报告git状态。所以你有两次延误。一种是通读这两组树,并将它们与索引内容进行比较,这可能非常快。第二个是运行git状态。这可能是缓慢的部分,特别是当您的git状态有时会更新文件的缓存信息时,和/或如果您正在使用git LFS。如果您启用了CRLF转换,或者在使用Git LFS时,在某些情况下,Git或LFS必须进行大量数据转换和检查,以发现所有内容都是最新的。

如前所述,有些间接:

您可以省略,在这种情况下,命令将退化为 查看当前分支,这是一个带有 只显示跟踪的昂贵副作用 当前分支的信息(如果存在)

在您的特定情况下,由于-detach,它毕竟不是一个不可用的方法,但它仍然会产生相当昂贵的副作用部分

在内部,Git正在遍历当前提交和新提交,它假定这两个提交不同;在这种情况下,这种假设是错误的。无论这些提交的树在哪里不同,都必须对索引和工作树文件进行更改。这种更改在某些情况下是不允许的,这将中止git签出并保持所有内容不变。有关详细信息,请参阅,但请注意,由于树匹配是因为提交匹配,所以树不同的位置大小写始终为false:它们始终匹配


尽管树匹配,但它仍然会比较索引和工作树文件,以便像输出一样报告git状态。所以你有两次延误。一种是通读这两组树,并将它们与索引内容进行比较,这可能非常快。第二个是运行git状态。这可能是缓慢的部分,特别是当您的git状态有时会更新文件的缓存信息时,和/或如果您正在使用git LFS。如果您启用了CRLF转换,或者在使用Git LFS时,在某些情况下,Git或LFS必须进行大量数据转换和检查,以发现所有内容都是最新的。

。在我的情况下,可能会有工作副本更改。我正在执行-detach,以便通过“更新”分支到工作副本的状态。有没有更快的方法可以做到这一点?是的:请参阅同一问题的公认答案。您可以直接更新HEAD,而不是使用git checkout-detach在不更改任何其他内容的情况下断开与当前分支的连接。最终,您希望HEAD是对另一个分支的符号引用,而不是完全分离,因此git symbolic ref HEAD refs/heads/将在一个步骤中完成这一操作。您不希望触动索引和工作树,这不会触动甚至不会查看它们。省去git重置,它会触及已接受答案中的索引,您就可以在HEAD now命名的分支上进行git提交了。这是一个非常特殊的工作流程,不适合人类使用,这一点毫无价值。但对于某些自动构建过程来说,这是有意义的。在我的情况下,可能会有工作副本更改。我正在执行-detach,以便通过“更新”分支到工作副本的状态。有没有更快的方法可以做到这一点?是的:请参阅同一问题的公认答案。您可以直接更新HEAD,而不是使用git checkout-detach在不更改任何其他内容的情况下断开与当前分支的连接。最终,您希望HEAD是对另一个分支的符号引用,而不是完全分离,因此git symbolic ref HEAD refs/heads/将在一个步骤中完成这一操作。您不希望索引和工作树
没有动过,这不会碰他们,甚至不会看他们。省去git重置,它会触及已接受答案中的索引,您就可以在HEAD now命名的分支上进行git提交了。这是一个非常特殊的工作流程,不适合人类使用,这一点毫无价值。但对于某些自动构建过程来说,这是有意义的。