否定 git 路径规范 - 匹配除一个目录之外的所有文件



我正在将几个现有的存储库移动/合并为一个(它们都用于构建相同的整体应用程序(。其中一些有几个死项目,我只需要整个存储库中的一个目录。

我正在寻找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

相关内容

最新更新