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

如何在低速硬盘上管理大型git存储库?,git,version-control,Git,Version Control,我正在做的一个项目已经有机地增长了,而且repo中的大小、文件数量、文件类型等都增长得太多了。我已经搜索了一些git的优化,但似乎没有什么能完全适合我的情况。这是我想要的 手动跟踪文件-编辑文件时,我将手动执行git add。Git的假设未更改不会有帮助,因为我必须在每次添加之前执行——no-assessed unchanged Git commit应该只添加我在索引中暂存的文件,而不必担心任何其他文件。我看到git在使用core.ignoreStat之后花费了太多的时间 稀疏签出不应该首先下载

我正在做的一个项目已经有机地增长了,而且repo中的大小、文件数量、文件类型等都增长得太多了。我已经搜索了一些git的优化,但似乎没有什么能完全适合我的情况。这是我想要的

  • 手动跟踪文件-编辑文件时,我将手动执行
    git add
    。Git的
    假设未更改
    不会有帮助,因为我必须在每次添加之前执行
    ——no-assessed unchanged

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

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

  • 我的存储库是这样的,虽然有很多目录,但我只在一小部分目录中工作一段时间,然后再在另一部分目录中工作。一次很少需要所有目录。如果可以有一个命令,比如说
    git hide
    ,它可以隐藏工作树中的目录,并在我再次需要它之前解除git对它的跟踪,那就太好了。 我已经在使用
    core.ignoreStat
    status.showUntrackedFiles
    commit.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
    
  • 存储库仍然太慢

    此外,您能从以下几点中提出它如此缓慢的可能原因吗

    • repo中的文件太多
    • 存在大文件
    • git指数本身已经变得太大了,它正在减缓事态的发展例如,即使我添加了
      git-add a.txt&&git-commit-m“a.txt”
      ,其中
      a.txt
      是一个小文件,也需要很长时间才能完成
    • 硬盘速度慢。添加SSD会有帮助吗
    有几个git扩展,比如,等等。使用其中任何一个都会有帮助吗,或者切换到另一个VCS会更好吗


    我使用的是Ubuntu Gnome 16.04.1。

    添加SSD肯定能完成这项工作。我面临着完全相同的问题。一位同事有一台带有SSD的计算机,他的计算机执行每个git操作都要快得多。
    我尝试了你所说的一切,但问题是性能太低。Git正在使用大量的小文件(看看你的.Git目录)来管理不同版本的文件,因此糟糕的IO延迟正在减缓这一切。

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

    参见,,,(2017年3月6日)和,,,,,,,(2017年2月27日)作者。
    (于2017年3月17日被合并)

    修订后的计划现包括:

    分割索引 此模式专为具有非常大索引的存储库而设计,并且 旨在减少重复写入这些索引所需的时间

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

    • $GIT_目录/索引
    • $GIT\u DIR/sharedindex.
    更改在拆分索引
    $GIT_DIR/index
    中累积,而共享索引文件包含所有索引项并保持不变

    拆分索引中的所有更改都会推回到共享索引 当分割索引中的条目数达到某个级别时 由指定的

    每次创建新的共享索引文件时,旧的共享索引 如果文件的修改时间早于实际时间,则会删除这些文件 由指定的

    为避免删除仍在使用的共享索引文件,其 每次新拆分时,修改时间都会更新为当前时间 创建或读取基于共享索引文件的索引

    因此,您现在(Git 2.13,2017年第2季度)拥有以下配置:

    splitIndex.maxPercentChange:
    
    使用拆分索引功能时,这将指定 拆分索引可以包含的项的百分比与 拆分索引和共享索引中的项目总数 在写入新的共享索引之前进行索引

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

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

    以及:

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

    值“now”将立即使所有条目过期,“never”将完全取消过期

    默认值为“
    2.weeks.ago

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


    在Git2.27(2020年第2季度)中,刷新磁盘上打包文件和松散对象文件的上次访问和修改时间的代码已经更新

    参见(2020年4月14日)作者。
    (于2020年4月28日合并)

    :对隐式当前时间使用
    空时间
    签字人:卢西亚诺·米格尔·费雷拉·罗查

    更新
    freshen_file()
    以使用
    NULL
    时间
    ,语义上等同于当前设置,将显式
    actime
    modtime
    设置为“当前时间”,但其优点是可用于当前用户不拥有的其他文件

    修复了使用拆分索引的共享回购上的一个问题,最终用户的操作将创建一个共享索引,而另一个用户稍后将执行一个操作,尝试更新其新鲜度,但会发出警告:

    $ git status
    warning: could not freshen shared index '.git/sharedindex.bd736fa10e0519593fefdb2aec253534470865b2'
    
    如果这是s
    $ git status
    warning: could not freshen shared index '.git/sharedindex.bd736fa10e0519593fefdb2aec253534470865b2'