如何在慢速硬盘上管理大型git存储库?

时间:2016-09-14 14:19:11

标签: git version-control

我正在开发的项目已经有机地发展,并且回购中的文件大小,文件数量,文件类型等都增长得太多了。我已经搜索了几个git的优化,似乎没有什么能完全符合我的情况。这就是我想要的。

  1. 手动跟踪文件 - 当我编辑文件时,我将手动执行git add <file-name>。 Git的assume-unchanged没有帮助,因为我必须在每次添加之前做--no-assume-unchanged

  2. Git commit应该只添加我在index中暂存的文件而不用担心任何其他文件。我已经看到git在使用core.ignoreStat之后花了太多时间。

  3. 稀疏结账不应该首先下载整个存储库(即使我使用--depth 1,它也是一个非常大的存储库)。 (但是,使用git可能无法实现)

  4. 我的存储库是这样的,虽然有很多目录,但我只在一小段目录中工作一段时间,然后在其他时间段中工作。一次很少需要所有目录。如果可以有一个命令,比如说git hide <directory>隐藏工作树中的目录,并且让git无法跟踪它直到我再次需要它,那将会很好。 我已经在使用core.ignoreStatstatus.showUntrackedFilescommit.status。这是我的git配置。

    user.email=xxx@xxx
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    core.ignorestat=true
    core.showuntrackedfiles=no
    remote.git_ch.url=file:////home/xxx/git_server/linux-namespaces.git
    remote.git_ch.fetch=+refs/heads/*:refs/remotes/git_ch/*
    branch.master.remote=git_ch
    branch.master.merge=refs/heads/master
    status.showuntrackedfiles=no
    commit.status=false
    
  5. 存储库仍然太慢。

    另外 ,你能否说出这些可能的原因?

    • repo中的文件太多
    • 存在大文件
    • git索引本身已经变得太大了,它正在减慢速度。 - 例如,即使我git add a.txt && git commit -m "a.txt" a.txt是一个小文件,也需要很长时间才能完成。
    • 硬盘速度慢。会添加SSD帮助吗?

    有几个git扩展程序,例如git annexGoogle's git repo等。使用其中任何一个都会有帮助,或者更好地切换到另一个VCS?

    我使用的是Ubuntu Gnome 16.04.1。

2 个答案:

答案 0 :(得分:3)

注意:Git 2.13可能有助于减轻对大型索引回购的支持:

请参阅commit b460139commit b2dd1c5commit c3a0082commit de6ae5fcommit c0441f7commit b968372(2017年3月6日)和{{3} },commit 77d6797commit 0d59ffbcommit 6a5e6f5commit e77cf4ecommit fcdbd95commit e6a1dd7commit 72dcb7bcommit 13c0e4ccommit 66f9e7acommit b8923bfcommit 6cc1053commit 4392531commit cef4fc7(2017年2月27日)commit 1f44b09
Christian Couder (chriscool)于2017年3月17日Junio C Hamano -- gitster --合并)

修订后的commit 94c9b5a现在包含git update-index documentation

  

拆分索引

     

此模式适用于具有非常大索引的存储库,以及   旨在减少重复编写这些索引所需的时间。

     

在此模式下,索引将分为两个文件

     
      
  • $ GIT_DIR / index
  •   
  • $GIT_DIR/sharedindex.<SHA-1>
  •   
     

更改在$GIT_DIR/index(拆分索引)中累积,而共享索引文件包含所有索引条目并保持不变。

     

拆分索引中的所有更改都会被推回到共享索引   当分割索引中的条目数达到一个级别时的文件   由Split Index section指定。

     

每次创建新的共享索引文件时,都会使用旧的共享索引   如果文件的修改时间早于文件,则删除这些文件   由splitIndex.maxPercentChange config variable指定。

     

为避免删除仍在使用的共享索引文件,请执行此操作   每次新拆分时,修改时间都会更新为当前时间   基于共享索引文件的索引可以创建或读取。

所以你现在(Git 2.13,2017年第二季度)有配置:

splitIndex.maxPercentChange:
  

使用拆分索引功能时,指定   拆分索引可以包含的条目百分比   拆分索引和共享中的条目总数   写入新共享索引之前的索引。

     

该值应介于0和100之间   如果值为0,则始终写入新的共享索引,
  如果它是100,则永远不会写入新的共享索引。

     

默认值为20,因此如果拆分索引中的条目数大于条目总数的20%,则会写入新的共享索引。

splitIndex.sharedIndexExpire::
  

使用拆分索引功能时,在创建新的共享索引文件时,将删除自此变量指定以来未修改的共享索引文件。

     

价值&#34;现在&#34;立即过期所有条目,&#34;永远不会#34;完全抑制过期。

     

默认值为&#34; 2.weeks.ago&#34;。

     

请注意,每次基于它创建或从中读取新的拆分索引文件时,都会将共享索引文件视为已修改(为了过期)。

答案 1 :(得分:0)

添加SSD肯定会完成这项工作。我面临着同样的问题。一位同事有一台带有SSD的计算机,他的计算机每一次git动作都要快得多。 我试过你所说的但问题是IO性能真的很低。 Git使用了许多小文件(查看你的.git目录)来管理不同版本的文件,因此糟糕的IO延迟会降低这一点。