git状态需要太长时间

时间:2013-06-01 16:34:46

标签: git git-svn git-status

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

我做错了什么?这是一个visual studio项目,我假设.gitignore文件不包含正确的内容。是否有可能确切地找出从Visual Studio构建生成哪些文件以及哪些文件必须进行版本控制?

如果.gitignore文件不是问题,我怎样才能使我的git status更快,对于6500个文件(大约10GB)的项目来说,使用git工作的速度是否正常?

2 个答案:

答案 0 :(得分:5)

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

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

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

  • 查看git help svn的“配置”部分。这描述了设置Git-SVN以在Subversion存储库中使用跟踪子文件夹(例如trunk/project-abranches/*/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
      
    3. 请查看--assume-unchanged中的git help update-index选项和config.ignoreStat中的git help config部分,了解有关这些工作原理的更多信息。

      使用这些将意味着您需要明确指定git diffgit add等命令的路径,即裸git diffgit commit -a和c之类的命令不会工作

    4. 更改操作系统和/或文件系统。根据Git手册页(与上一个项目中的相同),Windows {lstat速度很慢,CIFS文件系统也是如此。我怀疑理想是Linux或其他* nix上的ext3或ext4。

答案 1 :(得分:1)

自2013年以来,您现在(2020年)将拥有专用的git sparse-checkout,该功能只能帮助克隆Git存储库的相关子集。

不仅git状态会更快,而且在Git 2.28(2020年第三季度)中,“ git status”学会了报告稀疏签出的状态。

请见commit afda36dcommit 30b00f0commit 051df3c(2020年6月21日)和Elijah Newren (newren)(2020年6月18日)。
(由Junio C Hamano -- gitster --commit 0cc4dca中合并,2020年7月6日)

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

签名人:伊利亚·纽伦

人们在$ dayjob上尝试稀疏签出的一些早期反馈是,稀疏签出有时会使人迷惑。用户可能会忘记自己进行了稀疏签出,然后想知道文件在哪里。

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

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

很明显,确切的数字取决于索引中未设置SKIP_WORKTREE位的文件百分比。