16

我正在做一个版本控制系统是 SVN 的项目,我想使用 git。我做了一个 git svn clone 但git status运行速度非常慢(大约 8 分钟)。该存储库有大约 63000 个文件,其中大部分是 git 忽略的库。这是正常的吗?我做了git prune && git gc一个清理无法访问的对象和垃圾收集。我也做了一个git repack -Adf,但这让事情变得更糟。它需要更长的时间(超过20分钟)。

我究竟做错了什么?这是一个视觉工作室项目,我假设该.gitignore文件不包含正确的内容。是否可以准确找出哪些文件是从 Visual Studio 构建中生成的,哪些文件必须进行版本控制?

如果.gitignore文件不是问题,我怎样才能让我的git status速度更快,对于一个有 65000 个文件(大约 10GB)的项目来说,使用 git 运行这么慢是否正常?

4

2 回答 2

6

对于这种大小的存储库,git status相关的命令可能会非常慢。当项目被分开和分离时,Git 工作得更好,而 Subversion 倾向于鼓励使用包含多个项目的单个庞然大物存储库,所以在使用 Git-SVN 时这种问题并不少见。

尽管如此,您可以使用一些不同的解决方案来加快速度:

  • 如果您还没有,请升级到使用固态磁盘而不是磁盘。当我在一个类似的存储库上工作时,这个单一的变化对 Git 的速度产生了巨大的影响

  • 查看配置部分git help svn。这描述了将 Git-SVN 设置为使用 Subversion 存储库中的跟踪子文件夹(例如,、、trunk/project-a... branches/*/project-atags/*/project-a而不是整个存储库。如果这对您的存储库有意义,则意味着您可以有更小的签出和更快的git status.

  • 查看 的稀疏结帐部分git help read-tree。这将告诉你如何设置 Git 以使用稀疏工作副本,类似于 Subversion 稀疏检出。同样,这意味着 Git 在您的工作副本中跟踪的文件将更少,因此检查它们将再次更快。

  • 考虑在工作副本的大部分区域设置“假设不变”标志。这将告诉 Git 不要检查文件是否已更改。有两种方法可以做到这一点:

    1. 要为特定文件夹设置标志,请运行以下命令:

      find <folder-name>... -type f -exec git update-index --assume-unchanged {} +
      
    2. 为整个存储库设置标志(注意这将丢失未提交的更改):

      git config core.ignorestat true
      git reset --hard HEAD
      

    查看中的--assume-unchanged选项git help update-index和中的config.ignoreStat部分,git help config了解有关它们如何工作的更多信息。

    使用这些将意味着您需要明确地指定命令的路径,例如git diffgit addbare 和 &c 之类的命令git diffgit commit -a不起作用。

  • 更改您的操作系统和/或文件系统。根据 Git 手册页(与上一个项目符号中的相同),Windowslstat很慢,CIFS 文件系统也是如此。我怀疑理想情况是 Linux 或其他 *nix 上的 ext3 或 ext4 之类的东西。

于 2013-06-05T13:55:55.743 回答
2

自 2013 年以来,您现在(2020 年)拥有一个专用工具git sparse-checkout,可以帮助仅克隆 Git 存储库的相关子集。

不仅 git status 会更快,而且在 Git 2.28 (Q3 2020) 中, " git status" 学会了报告稀疏结帐的状态。

请参阅Elijah Newren ( ) 的commit afda36dcommit 30b00f0(2020 年 6 月 21 日)和commit 051df3c(2020 年 6 月 18 日(由Junio C Hamano 合并 -- --0cc4dca 提交中,2020 年 7 月 6 日)newren
gitster

wt-status:也显示稀疏结帐状态

签字人:以利亚·纽伦

在 $dayjob 尝试稀疏结账的人的一些早期反馈是,稀疏结账有时会让人迷失方向。用户可能会忘记他们有一个稀疏结帐,然后想知道文件去了哪里。

以简单行的形式将一些输出添加到“ git status”,其中说明:

You are in a sparse checkout with 35% of files present.  

显然,确切的数字会根据索引中没有SKIP_WORKTREE设置位的文件的百分比而变化。


注意: bash 提示脚本 (in contrib/) 在 " " 下不起作用set -u,已在 Git 2.32 (Q2 2021) 中修复。

请参阅Elijah Newren ( ) 的提交 5c0cbdb(2021 年 5 月 13 日(由Junio C Hamano 合并 -- --提交 02112fc中,2021 年 5 月 20 日)newren
gitster

git-prompt: 下工作set -u

签字人:以利亚·纽伦

提交afda36d (" git-prompt: include sparsity state as well", 2020-06-21, Git v2.28.0-rc0 -- merge列在批次#7 ) 添加了使用一些变量来控制如何在 git 提示符中显示稀疏状态,但隐含地假设未定义的变量将被视为空字符串。

这会破坏在 ' set -u' 下运行的用户;修复代码更明确。

于 2020-07-19T01:30:30.987 回答