簡體   English   中英

過濾出當前HEAD中不存在的所有項目的Git歷史記錄

[英]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.

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