我的主分支开头有一个包含.gitignore
文件的提交。
当我跑步时
git filter-branch -f --tree-filter 'git rm .gitignore' --prune-empty
新树仍然包含该节点,尽管是空的(.gitignore文件已被删除),因此已完成一半的工作。
为什么没有--prune-empty
修剪空提交?或者我误解了那个转换?
答案 0 :(得分:3)
git filter-branch
的prune-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)