没有参数的git filter-branch命令是做什么用的?

5

git filter-branch如果不加参数,会做什么?

我不小心在我的存储库上运行了这个命令,结果按下了回车键。


二十五分钟后... 重写 <sha1> (5019/8411) - Ben L
2
从文档中得知:"如果您没有指定任何过滤器,则提交将被重新提交而不进行任何更改,这通常没有任何影响。尽管如此,这可能在未来用于补偿某些 Git 错误或类似情况,因此允许这种用法。" - MicroVirus
话虽如此,我不确定它是否会改变sha1,但我认为它会。 - MicroVirus
1
@MicroVirus:新的(复制的)提交具有从其内容计算的SHA-1。如果内容与原始(复制前)内容完全匹配,则SHA-1也将匹配。这通常是情况,但我们遇到了至少一个有趣的i18n案例,其中提交文本从一种编码转换为另一种编码,因此无过滤器filter-branch会修改ID。(此外,filter-branch将应用嫁接。) - torek
3个回答

3

什么也没有。它似乎计算了哈希值并发现没有变化。


0

这是用于graft的,如git filter-branch所述:

将一个提交(通常位于另一个历史记录的顶部)设置为当前初始提交的父级,以便在当前历史记录后面粘贴其他历史记录:

git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' HEAD

这将在Git 2.6.4或Git 2.7(2015年12月)中更快。

请参见提交348d4f2(2015年11月6日),由Jeff King (peff)创建。
(由Junio C Hamano -- gitster --提交2e5adec中合并,2015年12月4日)

filter-branch:尽可能跳过索引读写

如果用户指定了索引过滤器但没有树过滤器,filter-branch会巧妙地避免完全检出树。
但我们没有进行下一级的优化:如果您没有索引或树过滤器,我们根本不需要读取索引。

这可以极大地加快仅更改提交对象(例如,将嫁接固定在原处)的情况。
以下是新添加的性能测试数据:

Test                  HEAD^              HEAD
---------------------------------------------------------------
7000.2: noop filter   13.81(4.95+0.83)   5.43(0.42+0.43) -60.7%

0

Filter-branch会检查并对由git rev-list输出的提交进行任何必要的重写,这些提交是由它传递的参数提供的。如果没有要传递的参数,rev-list将使用HEAD,即您当前的checkout。

除了您在命令行上指定的任何修改之外,filter-branch还会将.git/info/graftsgit replace中的本地覆盖内容嵌入其中。

因此,要使当前的checkout变为孤立状态,您可以执行以下操作:git rev-parse @ >.git/info/grafts; git filter-branch


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接