git filter-branch的--prune-empty开关不会在分支开头修剪空提交

时间:2016-04-27 07:12:07

标签: git git-filter-branch

我的主分支开头有一个包含.gitignore文件的提交。

当我跑步时

git filter-branch -f --tree-filter 'git rm .gitignore' --prune-empty

新树仍然包含该节点,尽管是空的(.gitignore文件已被删除),因此已完成一半的工作。

为什么没有--prune-empty修剪空提交?或者我误解了那个转换?

1 个答案:

答案 0 :(得分:3)

git filter-branchprune-empty选项确实提到:

  

此开关仅适用于只有一个父级的提交

如果您在master分支"的开头修改了提交,那么它有0个父级。
那个特别的提交,即使是空的,也不会被修剪。

如果修改后的提交是"在分支的开头",

beginning of a branch b
     |
     v
--x--Y--z--z
      \
       b--b

it should be pruned仅当该空提交与先前提交相同时。

作为torek mentions here:*

  

"空提交"实际上是一个与前一次提交具有相同树的:它并不是说它根本没有文件,它具有相同的文件,具有相同的模式,并且与其父提交相同的内容   这是因为git为每个提交存储完整的快照,而不是从一个提交到下一个提交的差异。

正如文件所说:

  

某种类型的过滤器会生成空提交,保持树不变

所以提交" 0文件"是"空提交"从filter-branch的角度来看,除非父提交有" 0文件" (即相同的empty "semi-secret" tree