我有一个我想要过滤的repo,以删除当前HEAD中不存在的所有文件/目录的提交历史记录(即使它们在之前的提交中已被删除)。输出过滤掉的项目列表以及审计是很好的。
我正在尝试将历史记录仅折叠为当前HEAD中的项目。
我怀疑这是一个过滤器分支或类似的操作,但不太确定如何将其关闭。
答案 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'