实际上这是可能的,而且这个问题已经在这里提出了几次,虽然没有通用的方法,看起来你必须自己组合配方。
如果你只想留下my_new_subdir
目录中的文件,你需要自己删除所有其他文件。概念是使用:
git filter-branch --tag-name-filter cat --index-filter \
'git rm -r --cached --ignore-unmatch
unneeded-subdir-1 unneeded-pattern-* unneeded-etc' \
--prune-empty -f -- --all
然后要帮助找到什么其他需要删除的东西,您可以使用类似于以下内容的内容:
然后要帮助找到其他需要删除的内容,您可以使用如下方式:
git log --name-status --all | grep -P '^\w\s+[\S]+$'
甚至可以是例如:
git log --name-status --all | grep -P '^\w\s+[\S]+$' | \
sed s/^.// | cut -f 1-2 -d '/' | sort -u
使用这种方法,您可以找到存储库中任何时候存在的所有文件/目录(或仅在第二种情况下路径的前两个段落)。之后,您可以使用以下命令清理存储库:
git gc --aggressive
将文件移动到左侧的my_new_subdir
后,我使用了以上命令的组合来清理历史记录中的任何不必要的文件。然而,我仍然发现了一些无关的合并记录,但最终我对结果感到满意。请注意,在上面的git命令中有许多参数是关键的,可以遍历所有的历史记录、分支和标签。
为了加快速度,您可以先识别要删除的库中最大的部分,然后进行git gc --aggressive
操作。用i5 CPU和SSD硬盘,完成一个git filter-branch
迭代大约需要一分钟,大约处理了1000个历史记录条目。