我正在将几个现有的存储库移动/合并为一个(它们都用于构建相同的整体应用程序(。其中一些有几个死项目,我只需要整个存储库中的一个目录。
我正在寻找git rm
pathspec 语法(用于重写存储库历史记录(,该语法将删除除 SomeSampleDirectory
中的文件之外的所有文件。
因此,本质上是对以下各项的否定:
git filter-branch -f
--prune-empty
--index-filter
"git rm --cached -f --ignore-unmatch SomeSampleDirectory/*"
--tag-name-filter cat -- --all
如果我理解正确,您需要以下内容:
ls | grep -v SomeSampleDirectory | xargs git rm --cached -f
ls
不能使用--index-filter
,因为内容不会在磁盘上。
在存储库的根目录中查看活动提交的文件/目录的平面列表的一种方法是:
$ git show HEAD^{tree}
tree HEAD^{tree}
.gitattributes
.gitignore
.mailmap
...
您可以使用tail -n +3
删除输出的 2 条前导线
因此,您可以使用以下命令删除"除SomeSampleDirectory之外的所有内容":
git show HEAD^{tree} | tail -n +3 | grep -v SomeSampleDirectory |
xargs git rm --cached -f
作为要应用于每个提交的命令。
注意:请注意,如果由于某种原因您还需要保留一些其他文件(.gitattributes
,.gitignore
,...(,则可以在此过程中添加一些额外的grep -v foobar
。