![](/img/trans.png)
[英]How do I clean all git history and blobs of files not currently present in HEAD with BFG
[英]Filter out Git history for all items NOT present in current HEAD
我有一個要過濾的倉庫,以刪除當前HEAD中不存在的所有文件/目錄的提交歷史(即使它們在先前的提交中已被刪除)。 最好輸出已過濾掉的項目列表以進行審核。
我試圖將歷史記錄僅折疊到當前HEAD中的項目。
我懷疑這是過濾分支或類似操作,但不確定如何實現。
假設存儲庫不包含任何子模塊。
1.找到HEAD
中作為組1的所有文件。
git ls-tree -r --name-only HEAD | sort -u
2.查找在HEAD
祖先中的所有文件,作為組2。
sort -u <(
for commit in $(git log --pretty=%H $(git log --pretty=%P HEAD));do
git ls-tree -r --name-only $commit
done;
)
3.查找組2中而不是組1中的文件。
diff -B <(git ls-tree -r --name-only HEAD | sort -u) <(
sort -u <(
for commit in $(git log --pretty=%H $(git log --pretty=%P HEAD));do
git ls-tree -r --name-only $commit
done;
)
) | awk '/^>/{print "\""$2"\""}'
4.將這些文件合並為"path1" "path2" "path3"
paths=$(
diff -B <(git ls-tree -r --name-only HEAD | sort -u) <(
sort -u <(
for commit in $(git log --pretty=%H $(git log --pretty=%P HEAD));do
git ls-tree -r --name-only $commit
done;
)
) | awk '/^>/{print "\""$2"\""}'
)
5.從HEAD
的歷史記錄中刪除這些文件。
git filter-branch --prune-empty -f --tree-filter 'rm -rf $paths'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.