从Git历史记录中删除文件夹内容,但一组文件除外



我希望从git历史记录中删除文件夹(可以递归地拥有文件夹(的内容。然而,一些较旧的提交甚至没有文件夹,而一些较新的提交在我想要保留的文件夹中有文件。

假设文件夹是foo(在路径/path/to/foo中(,要保留的文件称为bar1bar2(例如,/path/to/foo/bar1(。

我意识到这个问题并不新鲜。在这个问题中,使用了一个长而难读的脚本(至少对于初学者来说(。这个问题是最新的,使用了git filter-branch,但我不明白最终的解决方案是什么。最后,这个问题可能是最相似的,但对于没有git高级知识的人来说,答案并不是"剖析"出来的,所以我没有信心尝试这些命令。

据我所见,git2.17的当前方法是对每个分支使用git filter-branch。然后使用tree-filterindex-filter(从文档中我看不出用例之间的区别(。最后是一个带有正则表达式的git rm命令,该正则表达式与除bar之外的foo的内容相匹配。正则表达式的第一部分可能很简单(/path/to/foo/*(,但我不确定如何添加异常。

如果有人能在提出解决这个问题的命令时打破这一切,我将不胜感激。

git filter-branch --index-filter '
dir=path/to/folder
git rm -qr --cached --ignore-unmatch $dir
git reset $GIT_COMMIT -- $dir/file1 $dir/file2 $dir/file3
'

索引过滤器和树过滤器之间的唯一区别是,树过滤器将提交的所有内容加载到树中,然后通过将树中的所有内容与索引中列出的内容进行比较来为您更新索引,更新索引以匹配新的树内容。这很简单,只是很慢,而且通常是不必要的。

相关内容

最新更新