我正在开发一个版本控制系统是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工作的速度是否正常?
答案 0 :(得分:5)
对于该大小的存储库,git status
和相关命令可能非常慢。当项目被分开和分离时,Git工作得更好,而Subversion倾向于鼓励使用包含多个项目的单个庞然大物库,因此使用Git-SVN时这种问题并不少见。
尽管如此,您可以使用一些不同的解决方案来加快速度:
如果还没有,请升级到使用固态磁盘而不是磁盘。当我在一个类似的存储库上工作时,这个单一的改变对Git的速度产生了巨大的影响
查看git help svn
的“配置”部分。这描述了设置Git-SVN以在Subversion存储库中使用跟踪子文件夹(例如trunk/project-a
,branches/*/project-a
,tags/*/project-a
,...)而不是整个存储库。如果这对您的存储库有意义,那么这意味着您可以使用更小的结帐和更快的git status
运行。
查看git help read-tree
的稀疏结账部分。这将通过设置Git来使用稀疏的工作副本,类似于Subversion稀疏结账。同样,这意味着Git在您的工作副本中跟踪的文件将更少,因此检查它们将再次更快。
考虑在工作副本的大部分上设置“假设未更改”标志。这将告诉Git不要检查文件是否已更改。有两种方法可以做到这一点:
要设置特定文件夹的标志,请执行以下操作:
find <folder-name>... -type f -exec git update-index --assume-unchanged {} +
设置整个存储库的标志(请注意,这将丢失未提交的更改):
git config core.ignorestat true
git reset --hard HEAD
请查看--assume-unchanged
中的git help update-index
选项和config.ignoreStat
中的git help config
部分,了解有关这些工作原理的更多信息。
使用这些将意味着您需要明确指定git diff
和git add
等命令的路径,即裸git diff
,git commit -a
和c之类的命令不会工作
更改操作系统和/或文件系统。根据Git手册页(与上一个项目中的相同),Windows {lstat
速度很慢,CIFS文件系统也是如此。我怀疑理想是Linux或其他* nix上的ext3或ext4。
答案 1 :(得分:1)
自2013年以来,您现在(2020年)将拥有专用的git sparse-checkout
,该功能只能帮助克隆Git存储库的相关子集。
不仅git状态会更快,而且在Git 2.28(2020年第三季度)中,“ git status
”学会了报告稀疏签出的状态。
请见commit afda36d的commit 30b00f0,commit 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
位的文件百分比。