我正在将几个现有的存储库移动/合并为一个(它们都用于构建相同的单片应用程序)。其中一些有几个死项目,我只需要整个回购中的一个目录。
我正在寻找git rm
pathspec语法(用于重写repo历史记录),这将删除除SomeSampleDirectory
中的文件以外的所有文件。
所以,基本上,否定:
git filter-branch -f
--prune-empty
--index-filter
"git rm --cached -f --ignore-unmatch SomeSampleDirectory/*"
--tag-name-filter cat -- --all
答案 0 :(得分:1)
如果我理解正确,你需要按照以下方式进行:
ls | grep -v SomeSampleDirectory | xargs git rm --cached -f
ls
无法与--index-filter
一起使用,因为内容不会在磁盘上。
在repo的根目录中查看活动提交的文件/目录的平面列表的一种方法是:
$ git show HEAD^{tree}
tree HEAD^{tree}
.gitattributes
.gitignore
.mailmap
...
您可以使用tail -n +3
所以你可以使用:
删除“除SomeSampleDirectory之外的所有内容”git show HEAD^{tree} | tail -n +3 | grep -v SomeSampleDirectory |
xargs git rm --cached -f
作为在每次提交时应用的命令。
注意:显然,如果由于某种原因您还需要保留其他文件(.gitattributes
,.gitignore
,...),您可以添加一些额外的{{ 1}}一路走来。