2016-04-27 29 views
0

我想要使用git filter-branch并让我的intial commit由.gitignore组成(之后重新装入分支)生效。git filter-branch尊重我的初始提交.gitignore

这是我跑:

git filter-branch -f --tree-filter 'git rm -r --cached . && git add .' --prune-empty 

此命令但是离开仓库不变。

为什么?

我也想知道为什么下面的命令不会删除所有文件库:

git filter-branch -f --tree-filter 'git rm -r --cached .' 

回答

2

一个--tree-filter不操作上/与索引。相反,它会将每个提交复制到用作工作树的临时目录中,在该临时目录中运行命令,并使新的提交脱离临时目录中剩余的和/或新的任何文件。在此过程中对索引本身所做的更改将被有效忽略。

这意味着您必须从工作树中删除您的新.gitignore阻止添加的那些文件。你可以用git rm --cached--index-filter中手动执行此操作,这会更快,但如果你想让git在--tree-filter中为你完成工作,你可以使用git自己使用的相同技巧(见脚注):use git clean(与-x)清理临时目录。


这是不完全正确:filter-branch--tree-filter代码使用git read-tree填充填充的临时目录(而这又意味着它必须做一些工作,清理前的指数(重)的来自之前提交的临时目录,它使用git clean)。然后,在你的过滤器之后,它再次使用该索引来检查在临时目录中完成了什么。当你git rm -r --cached .然后git add .,它比较产生的索引,它不再有你的忽略文件,工作树和... 添加您的忽略文件。哎呀!

0

此解决方案,但它不支持空格文件名:

git filter-branch -f --tree-filter 'ls -r | xargs --no-run-if-empty \ 
git check-ignore --no-index | xargs --no-run-if-empty rm' --prune-empty 

它也产生非常长的线git check-ignore,即在工作目录(递归)的所有文件的清单。不能git check-ignore自己处理递归?文件名中有空格,如何支持这些?