我希望从git历史记录中删除文件夹的内容(可以递归地包含文件夹)。但是,一些较旧的提交甚至没有该文件夹,而一些较新的提交在该文件夹中有我要保留的文件。
假设文件夹位于foo
(在路径中/path/to/foo
),并且要保留的文件称为bar1
和bar2
(例如/path/to/foo/bar1
)。
我意识到这个问题并不新鲜。在这个问题中,使用了一个冗长且难以阅读的脚本(至少对于初学者而言)。这个问题是最新的并且使用了,git filter-branch
但是我不明白解决方案最终是什么。最后,这个问题可能是最相似的,但是对于没有git的高级知识的人来说,答案并不是“解剖”的,因此,我没有信心尝试这些命令。
从我所看到的,git 2.17的当前方法是git filter-branch
为每个分支使用。然后使用tree-filter
或index-filter
(从文档中我看不到用例的区别)。最后是一个git rm
带有正则表达式的命令,该命令与foo
except的内容匹配bar
。正则表达式的第一部分可能很简单(/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
'
索引过滤器和树过滤器之间的唯一区别是,树过滤器使用提交中的所有内容加载树,然后通过将树中的所有内容与索引中列出的内容进行比较来为您进行索引更新,并进行更新与新树内容匹配的索引。这很容易,只是速度很慢,通常是不必要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句