- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找减小 git
大小的方法存储库。搜索将我带到 git gc --aggressive
大多数时候。我还读到这不是首选方法。
为什么?如果我正在运行,我应该注意什么 gc --aggressive
?git repack -a -d --depth=250 --window=250
推荐过 gc --aggressive
.为什么?怎么样repack
减少存储库的大小?另外,我不太清楚标志 --depth
和 --window
.
我应该如何选择gc
和 repack
?我应该什么时候使用 gc
和 repack
?
最佳答案
现在没有区别:git gc --aggressive
按照 Linus 在 2007 年提出的建议进行操作;见下文。从 2.11 版(2016 年第 4 季度)开始,git 默认深度为 50。大小为 250 的窗口很好,因为它扫描每个对象的更大部分,但深度为 250 很糟糕,因为它使每个链都指向非常深的旧链对象,这会减慢所有 future 的 git 操作,从而略微降低磁盘使用率。
历史背景
Linus 建议使用 git gc --aggressive
(请参阅下面的完整邮件列表帖子)只有当你有,用他的话来说,“一个非常糟糕的包”或“非常糟糕的增量”,但是“几乎总是,在其他情况下,这实际上是一件非常糟糕的事情。”结果甚至可能使您的存储库状况比开始时更糟!
在导入了“漫长而复杂的历史”之后,他建议正确执行此操作的命令是
git repack -a -d -f --depth=250 --window=250
git filter-branch
documentation 中找到的用于缩小存储库的 list 。 .
git-filter-branch can be used to get rid of a subset of files, usually with some combination of
--index-filter
and--subdirectory-filter
. People expect the resulting repository to be smaller than the original, but you need a few more steps to actually make it smaller, because Git tries hard not to lose your objects until you tell it to. First make sure that:
You really removed all variants of a filename, if a blob was moved over its lifetime.
git log --name-only --follow --all -- filename
can help you find renames.You really filtered all refs: use
--tag-name-filter cat -- --all
when callinggit filter-branch
.Then there are two ways to get a smaller repository. A safer way is to clone, that keeps your original intact.
- Clone it with
git clone file:///path/to/repo
. The clone will not have the removed objects. See git-clone. (Note that cloning with a plain path just hardlinks everything!)If you really don’t want to clone it, for whatever reasons, check the following points instead (in this order). This is a very destructive approach, so make a backup or go back to cloning it. You have been warned.
Remove the original refs backed up by git-filter-branch: say
git for-each-ref --format="%(refname)" refs/original/ |
xargs -n 1 git update-ref -dExpire all reflogs with
git reflog expire --expire=now --all
.Garbage collect all unreferenced objects with
git gc --prune=now
(or if yourgit gc
is not new enough to support arguments to--prune
, usegit repack -ad; git prune
instead).
Date: Wed, 5 Dec 2007 22:09:12 -0800 (PST)
From: Linus Torvalds <torvalds at linux-foundation dot org>
To: Daniel Berlin <dberlin at dberlin dot org>
cc: David Miller <davem at davemloft dot net>,
ismail at pardus dot org dot tr,
gcc at gcc dot gnu dot org,
git at vger dot kernel dot org
Subject: Re: Git and GCC
In-Reply-To: <4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>
Message-ID: <alpine.LFD.0.9999.0712052132450.13796@woody.linux-foundation.org>
References: <4aca3dc20712051947t5fbbb383ua1727c652eb25d7e@mail.gmail.com>
<20071205.202047.58135920.davem@davemloft.net>
<4aca3dc20712052032n521c344cla07a5df1f2c26cb8@mail.gmail.com>
<20071205.204848.227521641.davem@davemloft.net>
<4aca3dc20712052111o730f6fb6h7a329ee811a70f28@mail.gmail.com>On Thu, 6 Dec 2007, Daniel Berlin wrote:
Actually, it turns out that
git-gc --aggressive
does this dumb thing to pack files sometimes regardless of whether you converted from an SVN repo or not.
绝对。git --aggressive
大多是哑巴。真的只对以下有用
案例“我知道我有一个非常糟糕的包,我想扔掉
我所做的所有糟糕的包装决定。”
为了解释这一点,值得解释一下(你可能已经意识到了,但是
无论如何,让我了解一下基础知识)git delta-chains 是如何工作的,以及如何
它们与大多数其他系统非常不同。
在其他 SCM 中,delta 链通常是固定的。可能是“前锋”
或“向后”,它可能会随着您使用存储库而有所发展,
但通常它是对单个文件的一系列更改,表示为
一种单一的 SCM 实体。在 CVS 中,显然是*,v
文件,还有很多
其他系统做相当类似的事情。
Git 也做 delta-chains,但它做的更“松散”。那里
不是固定实体。 Deltas 是针对任何随机的其他版本生成的
git 认为是一个很好的 delta 候选者(具有各种公平的
成功的启发式),并且绝对没有硬性分组规则。
这通常是一件非常好的事情。它适用于各种概念
原因(即,git 内部从不需要真正关心整个
修订链——它根本不考虑增量),但是
这也很棒,因为摆脱不灵活的 delta 规则意味着
git merge 两个文件完全没有问题,
例如——根本就没有任意的*,v
“修订文件”具有
一些 stash 的意思。
这也意味着增量的选择是一个更加开放的
问题。如果你将 delta 链限制为一个文件,你真的不会
关于如何处理增量有很多选择,但在 git 中,它真的
可能是一个完全不同的问题。
这就是名字很糟糕的地方--aggressive
进来了。虽然
git 通常会尝试重用 delta 信息(因为这是一个好主意,
并且不会浪费 CPU 时间重新查找我们找到的所有好的增量
更早),有时您想说“让我们从头开始,空白
slate,并忽略之前的所有delta信息,并尝试生成
一组新的增量。”
所以--aggressive
不是真的要咄咄逼人,而是要浪费
CPU 时间重新做一个我们之前已经做的决定!
有时这是一件好事。特别是一些导入工具可以
产生非常糟糕的增量。任何使用git fast-import
的东西,
例如,可能没有太多好的 delta 布局,所以它可能
值得说的是“我想从头开始。”
但几乎总是,在其他情况下,这实际上是一件非常糟糕的事情。
这会浪费 CPU 时间,特别是如果你真的做了一个
早期的 deltaing 做得很好,最终结果不会重用所有
你已经找到的那些好的增量,所以你实际上最终会得到一个
更糟糕的最终结果呢!
我将向 Junio 发送补丁以删除git gc --aggressive
文档。它可能很有用,但通常只有在您
真正在非常深的层次上了解它在做什么,并且
文档不能帮助你做到这一点。
一般做增量git gc
是正确的方法,而且更好
比做git gc --aggressive
.它将重新使用旧的增量,并且
当那些旧的 deltas 找不到时(做增量 GC 的原因)
首先!)它将创建新的。
另一方面,“长期的初始导入”绝对是正确的
和涉及的历史”是值得花很多钱的地方
是时候找到真正好的增量了。然后,以后的每个用户(如
只要他们不使用git gc --aggressive
撤消它!)将得到
那个一次性事件的优势。所以特别是对于大项目
历史悠久,可能值得做一些额外的工作,告诉三角洲
寻找疯狂的代码。
所以相当于git gc --aggressive
- 但做得正确 - 是
做(过夜)类似的事情
git repack -a -d --depth=250 --window=250
深度的东西只是关于三角链的深度
(让它们在古老的历史中更长——值得花费空间),和
窗口的事情是关于我们想要每个增量的对象窗口有多大
候选人进行扫描。
在这里,您可能想添加-f
标志(即“全部删除
旧三角洲,”因为你现在实际上是在努力确保这个
实际上找到了好的候选人。
然后它将需要永远一天的时间(即“一夜之间”
东西)。但最终的结果是下游的每个人
存储库将获得更好的包,而无需花费任何精力
对它自己。
Linus
关于git gc --aggressive 与 git repack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28720151/
在我们对延迟敏感的应用程序中,我们有缓存数据(驻留在 TG 中)和在 YG 中消亡的短暂对象。我已经看到次要 GC 时间和主要 GC 时间有显着差异。我怀疑这与TG的尺寸相对较大有关。谁能解释 GC
我看到了多个建议运行 GC.Collect(GC.MaxGeneration) 的答案。 既然方法GC.Collect()会收集所有存在的分代,那么两者有什么区别吗? 也许如果只有两代而不是三代,GC
我们正在使用 UseParallelGC。 GC 日志看起来像 2016-06-09T19:38:17.362+0000:655312.397:[完整GC(人体工程学)[PSYoungGen:2291
我最近看到了两个非常好的和有教育意义的语言讲座: This first one由 Herb Sutter 撰写,介绍了 C++0x 的所有漂亮和酷炫的特性,为什么 C++ 的 future 似乎比以往
我们正在运行 gerrit 2.10.7,我们偶尔会遇到损坏的对象没有被 gerrit gc 修复的问题,即使 git gc 可以很好地修复它们。 另一方面,我读到 gerrit gc 会创建优化其他
我试图避免 Full GC(来自下面的 gc.log 示例)在生产中的 Tomcat 中运行 Grails 应用程序。关于如何更好地配置 GC 有什么建议吗? 14359.317:[完整 GC 143
我试图通过在析构函数中使用 console.WriteLine() 来确保释放某个类的实例,但输出从未出现。 我仔细搜索了任何挥之不去的引用资料以及事件订阅,但没有找到。只是为了我自己的理智,在我继续
之前看过一篇文章,说FGC影响时序,导致application出错结果。 代码示例如下: long start = System.currentTimeInMillis(); doSomething(
在 Java 中,我们可以使用 System.gc() 方法来建议 GC。今天我从this link开始了解C#中的GC.Collect()方法。 . 但我对解释有些不清楚。 第一行。 Forces
我理解 Python GC 有两种工作方式: 1) 基本引用计数 - 当“name”设置为“Tom”时,“John”下方的引用计数为零 name = "John" name = "Tom" (Refe
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
今天我们使用并发标记清除,具体如下: -XX:+UseConcMarkSweepGC 我看到一些文章推荐使用这种形式的附加参数: -XX:+UseConcMarkSweepGC -XX:+CMSInc
当我运行我的程序时,logcat 显示很多 GC Activity 喜欢 GC freed 10324 objects/ 510376 bytes in 103 ms GC freed 10324 o
2013-11-26T10:19:30.011+0800: [GC [ParNew: 2432484K->19997K(2696640K), 0.0378270 secs] 5560240K->315
在执行 GC 时,JVM 会遍历 Activity 对象,并清除未标记的对象。 根据: How to Tune Java Garbage Collection “Full GC的执行时间相对Minor
我有一个分布式缓存应用程序(内存绑定(bind),由于与集群中其他节点的交互而具有网络 I/O)在 JVM 1.7.0_51 中运行,带有 G1 垃圾收集器。这是 JVM 配置: -server -X
首先,我想让您知道,这是一个理论问题而不是实际问题,我只是好奇弱引用对象是如何被释放的。让我们快速记住 Java 中的弱引用是什么。粗略地说WeakReference意味着当没有指向“我”的强引用时,
这是运行大约 10 分钟后的输出。 Heap PSYoungGen total 7040K, used 0K [0x24060000, 0x247c0000, 0x26790000)
我正在运行一个应用程序,在 Weblogic 上使用 java 5 和 CMS 垃圾收集器。在垃圾收集日志中,我看到了消息日志,其中大部分消息我可以使用 Sun 的 Java HotSpot 虚拟机中
我有一个 ConcurrentMap> map = new ConcurrentHashMap>(); 并且希望当 SoftReference 的引用被 GC 时从映射中删除键/值对。 我该如何实现这
我是一名优秀的程序员,十分优秀!