否定git pathspec - 匹配除一个目录之外的所有文件

时间:2017-03-20 09:29:33

标签: git

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

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

1 个答案:

答案 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

删除输出的2个前导行

所以你可以使用:

删除“除SomeSampleDirectory之外的所有内容”
git show HEAD^{tree} | tail -n +3 | grep -v SomeSampleDirectory |
    xargs git rm --cached -f

作为在每次提交时应用的命令。

注意:显然,如果由于某种原因您还需要保留其他文件(.gitattributes.gitignore,...),您可以添加一些额外的{{ 1}}一路走来。