代码之家  ›  专栏  ›  技术社区  ›  Alexandre Rademaker

Git中的文件限制是什么(数量和大小)?

git
  •  166
  • Alexandre Rademaker  · 技术社区  · 16 年前

    有人知道文件数量和文件大小的Git限制是什么吗?

    10 回复  |  直到 7 年前
        1
  •  152
  •   Community CDub    8 年前

    此消息来自 Linus himself 可以帮你解决其他的问题

    […]cvs,也就是说,它实际上是面向“一个文件”的。 “一次”模式。

    很好,你可以有一百万个文件,然后只检查 他们中的一些-你永远不会 看见 另一个的影响 99999个5个文件。

    吉特 从根本上说,从来没有真正关注的少于整个回购。即使你 把事情限制一点(只检查一部分,或让历史过去) 稍微后退一点),Git最终仍然关心整个事情, 把知识带到身边。

    所以如果你强迫它把所有的东西都看成一个的话,Git的规模真的很糟糕。 巨大的 储存库。我不认为那部分真的是固定的,尽管我们 可能会有所改善。

    是的,那就是“大文件”问题。我真的不知道该怎么办 处理大文件。我知道,我们很讨厌他们。

    看我的更多 other answer :Git的限制是每个存储库必须表示一个“ coherent set of files “,即“所有系统”本身(不能标记“存储库的一部分”)。
    如果系统由自主(但相互依赖)部件组成,则必须使用 submodules .

    如图所示 Talljoe's answer ,限制可以是 系统 一个(大量的文件),但是如果你确实理解了git的本质(关于它的sha-1键表示的数据一致性),你会发现真正的“限制”是 使用 一:也就是说,你不应该试图储存 一切 在Git存储库中,除非您准备总是获取或标记所有内容。对于一些大型项目来说,这毫无意义。


    要更深入地了解Git限制,请参见“ git with large files
    (提到什么) git-lfs :在git repo之外存储大型文件的解决方案。Github,2015年4月)

    限制Git回购的三个问题:

    • 海量文件 (the xdelta for packfile 只在内存中,这对大文件不好)
    • 大量文件 也就是说,每个blob有一个文件,并且每次生成一个packfile的速度很慢。
    • 巨型包装文件 ,因为packfile索引无法从(巨大的)packfile中检索数据。

    最近的一个线程(2015年2月)说明了 the limiting factors for a Git repo :

    中央服务器上的一些同步克隆是否也会减慢其他用户的其他并发操作?

    克隆时服务器中没有锁,因此理论上克隆不会影响其他操作。但是克隆可以使用大量的内存(以及大量的CPU,除非您打开了可达性位图功能,这是您应该的)。

    威尔 git pull 慢一点?

    如果我们排除服务器端, 你的树的大小是主要因素 但是您的25K文件应该是正常的(Linux有48K文件)。

    git push “?

    这一点不受回购历史的深度或树的宽度的影响,所以应该很快。

    啊,refs的数量可能会同时影响 git-push git-pull .
    我想斯特凡比我更了解这个领域。

    git commit “?(列为慢进 reference 3 ) ’ git status “?(在参考文献3中,虽然我看不到,但速度还是慢了一点。)
    (也) git-add )

    同样,你的树的大小。按你的回购规模,我认为你不必担心。

    有些操作似乎不是每天都在进行,但是如果Web前端经常将它们调用到gitlab/stash/github等,那么它们可能会成为瓶颈。(例如) git branch --contains “似乎受到大量分支机构的严重不利影响。”

    git-blame 当文件被大量修改时可能会变慢。

        2
  •  32
  •   Talljoe    16 年前

    没有真正的限制——所有的名称都是用160位的名称命名的。文件的大小必须以64位数字表示,因此也没有实际限制。

    不过,这是一个实际的限制。我有一个大约8GB的存储库,其中包含>880000,而Git GC需要一段时间。工作树相当大,因此检查整个工作目录的操作需要相当长的时间。不过,这个repo只用于数据存储,所以它只是一堆处理它的自动化工具。从回购中提取更改要比同步相同数据快得多。

    %find . -type f | wc -l
    791887
    %time git add .
    git add .  6.48s user 13.53s system 55% cpu 36.121 total
    %time git status
    # On branch master
    nothing to commit (working directory clean)
    git status  0.00s user 0.01s system 0% cpu 47.169 total
    %du -sh .
    29G     .
    %cd .git
    %du -sh .
    7.9G    .
    
        3
  •  28
  •   Community CDub    8 年前

    如果您添加的文件太大(在我的例子中是gbs,cygwin,xp,3gb ram),应该是这样的。

    致命:内存不足,malloc失败

    更多细节 here

    更新3/2/11:在Windows7x64中看到类似的乌龟Git。使用了大量的内存,系统响应非常慢。

        4
  •  17
  •   CharlesB Craig McQueen    11 年前

    2012年2月,有一个非常有趣的 thread on the Git mailing list 来自Facebook软件工程师Joshua Redstone,他在一个巨大的测试库中测试Git:

    测试报告有400万次提交,线性历史,约130万次。 文件夹。

    运行的测试表明,对于这样一个回购git是不可用的(冷操作持续分钟),但这可能在未来改变。基本上,表演会受到 stat() 调用内核fs模块,因此它将取决于repo中的文件数和fs缓存效率。也见 this Gist 供进一步讨论。

        5
  •  3
  •   Dustin    16 年前

    这取决于你的意思。有实际的大小限制(如果你有很多大文件,它会变得非常缓慢)。如果你有很多文件,扫描速度也会变慢。

    不过,模型并没有真正固有的限制。你当然可以用得不好,而且很痛苦。

        6
  •  1
  •   Kzqai    15 年前

    我认为最好避免将大型文件提交作为存储库的一部分(例如,数据库转储在其他地方可能更好),但如果考虑到存储库中内核的大小,您可能希望能够轻松地处理任何较小且不那么复杂的文件。

        7
  •  1
  •   funwhilelost    13 年前

    我有大量的数据作为单独的JSON片段存储在我的repo中。在一些目录下有大约75000个文件,这对性能并没有真正的损害。

    第一次检查它们显然有点慢。

        8
  •  1
  •   Kasisnu    10 年前

    我发现它试图在回购中存储大量文件(350K+)。是的,商店。笑。

    $ time git add . 
    git add . 333.67s user 244.26s system 14% cpu 1:06:48.63 total
    

    以下是位桶的摘录 documentation 很有趣。

    当您使用DVCS存储库克隆、推送时,您将使用整个存储库及其所有历史记录。实际上,一旦您的存储库超过500MB,您就可能开始发现问题。

    …94%的BitBucket客户拥有500MB以下的存储库。Linux内核和Android都低于900MB。

    该页面上建议的解决方案是将项目拆分为较小的块。

        9
  •  0
  •   polygenelubricants    7 年前

    截至2018年4月20日 Git for Windows has a bug 它使用特定的实现有效地将文件大小限制为最大4GB(这个bug propagates to lfs as well )

        10
  •  -9
  •   Michael Hu    13 年前

    Git对回购有4G(32位)限制。

    http://code.google.com/p/support/wiki/GitFAQ