簡體   English   中英

如何從所有git commit中刪除索引中文件的所有出現

[英]How to remove all occurences of a file in index, from all git commits

第一次在這里使用git。 我不小心使用了.gitignore文件而沒有使用“ git init”,所以我的提交中包含了gradle /和build /文件。 我正在使用“ git ls-tree -r master”來顯示索引中的所有文件。 而不是檢出每個先前的提交並使用“ git rm --cached”刪除所有不必要的build和gradle文件,我如何通過所有先前的提交刪除所有出現的內容?

編輯:有沒有辦法刪除所有提交中的每個目錄和文件,只保留src目錄?

您可能確實希望使用filter-branch命令而不是rebase 無論哪種方式,都有幾項需要注意的事項:

  • 永遠無法更改任何現有的提交。
  • 因此,rebase和filter-branch都不會。 相反,他們復制提交。 現在,您的提交次數是原來的兩倍! 等等,什么?!
  • 但是,Git最終會並且確實會刪除它所謂的未引用對象(commit及其對應的文件),並且您可以根據需要以各種方式加快此過程。

因此,這就是rebase和filter-branch的作用:它們復制提交,並在提交副本之前允許進行一些更改。 然后,在提交了(略有不同)副本之后,他們將引用(分支和標記名稱)移至副本。

考慮到這一點,還有更多要考慮的項目:

  • 僅過濾器分支復制和移動標簽,並且僅在提供--tag-filter時才這樣做。 (如果你沒有標簽,這其實並不重要,很明顯)而且,當過濾器分支副本標注的標簽,它溝渠它們的簽名:他們成為無符號。 否則,您將不得不手動重新簽名它們,並且過濾器分支被設計為完全自動化的。
  • 因為filter-branch被設計為自動化的,並且因為它被設計為能夠在存儲庫中的每個提交上運行,所以它(a)往往很慢,並且(b)有很多復雜的選項可以加速它。 如果您沒有那么多的提交,那么這沒什么大不了的。 如果這樣做的話,研究如何使用其眾多選項來加快速度就可以了。
  • 因為這兩個命令都復制提交,所以如果其他任何人都有存儲庫的副本,那么您也要為它們做很多工作:它們需要切換到副本。 如果沒有,他們可以重新引入所有原始提交,然后您又回到原來的兩倍。

現在您已准備好鏈接的問題及其過濾分支答案。 不過,有關使用--tag-name-filter和一些加速選項的說明,也請參見有關問題的其他答案

請注意, git rm -f --cached --ignore-unmatch適用於目錄(或“文件夾”)名稱以及純文件名。 可以使用--tree-filter (在第二個鏈接的頁面上的其他答案中提到)代替--index-filter ,它對於復雜的操作更方便,但是慢得多(確切的速度根據操作系統的不同而不同) ,repo的大小,SSD與旋轉媒體存儲等,但是比使用--index-filter更好的“開始估算”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM