过滤掉当前HEAD中不存在的所有项目的Git历史记录

时间:2017-11-17 01:23:15

标签: git

我有一个我想要过滤的repo,以删除当前HEAD中不存在的所有文件/目录的提交历史记录(即使它们在之前的提交中已被删除)。输出过滤掉的项目列表以及审计是很好的。

我正在尝试将历史记录仅折叠为当前HEAD中的项目。

我怀疑这是一个过滤器分支或类似的操作,但不太确定如何将其关闭。

1 个答案:

答案 0 :(得分:1)

假设存储库不涉及任何子模块。

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'