2016-04-27 25 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自己處理遞歸?文件名中有空格,如何支持這些?