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

问题描述 投票:1回答:1

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

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

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

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

如果有人可以在提供解决此问题的命令时将其分解,我将不胜感激。

git git-filter-branch
1个回答
0
投票
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
'

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

© www.soinside.com 2019 - 2024. All rights reserved.