簡體   English   中英

git從整個歷史記錄中刪除所有已刪除的文件

[英]git remove all deleted files from entire history

我想知道是否有人有更有效,更聰明的方式來做到這一點。 循環結構要求通過讀取每個提交將每個刪除的文件刪除。 對於許多提交,這需要很長時間。

git log --pretty=format: --name-status | grep -i ^D | cut -f2- | sort -u | xargs -I {} git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch {}' HEAD

這似乎一次刪除了每個文件。
考慮到git rm可以刪除多個文件。

因此,一種優化方法是建立該列表並調用一次過濾分支。
您可以在“ 使用git filter-branch而不git rm失敗的正確方式刪除不需要的文件 ”中看到該方法的一個示例。

對於可能正在尋找相同答案的其他人,我修改了上面的原始命令,並在另一個線程中鏈接了建議,並創建了該命令,該命令似乎對我有用。

git filter-branch --prune-empty --index-filter 'git log --pretty=format: --name-status | grep -i ^D | cut -f2- | sort -u | xargs git rm --cached --ignore-unmatch DoesNotExistInMyProject'

只是小小的改進,以支持遞歸刪除

git filter-branch --prune-empty --index-filter 'git log --pretty=format: --name-status | grep -i ^D | cut -f2- | sort -u | xargs git rm -r --cached --ignore-unmatch DoesNotExistInMyProject'

改進了避免使用'引起xargs錯誤的文件名的命令

echo "/!\\ This file contains a single quote ' and it's gonna bug with xargs, so it's excluded from the filter operation" ; bash -c "git log --pretty=format: --name-status | grep -i ^D " | grep \\' git filter-branch -f --prune-empty --index-filter "git log --pretty=format: --name-status | grep -i ^D | grep -v \\' | cut -f2- | sort -u | xargs git rm -r --cached --ignore-unmatch DoesNotExistInMyProject"

暫無
暫無

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

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