2

我正在尝试git rm用作过滤器分支的一部分。我想删除目录*/*/dir1,但什么也没发生。我正在使用的命令是:

git filter-branch --tag-name-filter cat --index-filter "git rm -r --cached --ignore-unmatch */*/dir1" --prune-empty -f -- --all

命令

find . -wholename "*/*/dir1"

显示很多匹配项。

我怎样才能删除这些目录?

更新:我正在尝试从历史记录中删除这些文件夹。

解决方案:

结合@j6t 和@Sam Gleske 的答案,这是我的解决方案:

git filter-branch --tag-name-filter cat \
   --index-filter 'git ls-files | grep -E "^([^/]+/){2,3}dir1" |
                   xargs -I {} --no-run-if-empty git rm -r --cached "{}"' \
   --prune-empty -f -- --all
4

4 回答 4

0

使用这个(完全相同的顺序):

git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch */*/dir1' --prune-empty --tag-name-filter cat -- --all
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
于 2017-01-14T02:05:00.633 回答
0

根据git rm文档,您可以将一个或多个文件或文件夹传递给它。既然是这种情况,您就可以利用shell globbing。在bash中,您必须在引号之外使用 glob。

git rm -r */*/dir1

但是,有可能达到ARG_MAXLinux 的限制(即getconf ARG_MAX)并出现错误。您可以通过在原始 find 命令中使用 xargs 来解决此问题。

find . -wholename "*/*/dir1" -print0 | xargs -0 git rm -r

我还建议添加-type d到您的 find 命令,因为其他文件类型可能与dir1.

那只会将这些目录作为新提交删除。


使用 xargs 清除所有历史记录

由于您的意图是清除所有历史记录,并且 globbing 无法按预期使用git rm; 你还有另一个选择。使用原始find命令 withxargs使用find. 就是这样:

find . -wholename "*/*/dir1" -print0 | xargs -0 -I '{}' -n10 -- git filter-branch --tag-name-filter cat --index-filter "git rm -r --cached --ignore-unmatch {}" --prune-empty -f -- --all

诀窍是注意命令中的-I '{}'选项xargs和使用将被执行。{}xargs

也可以看看

于 2017-01-14T02:55:50.803 回答
0

以下应该做你需要的:

git filter-branch --tag-name-filter cat \
   --index-filter 'git ls-files -z -- "*/*/dir1" |
                   xargs -0 --no-run-if-empty git rm -r --cached' \
   --prune-empty -f -- --all

请注意,该命令确实会下降到目录中,即,a/b/c/d/dir1即使**没有在 的参数中使用它也会匹配git ls-files

于 2017-01-16T08:16:36.637 回答
0

结合@j6t 和@Sam Gleske 的答案,这是我的解决方案:

git filter-branch --tag-name-filter cat \
   --index-filter 'git ls-files | grep -E "^([^/]+/){2,3}dir1" |
                   xargs -I {} --no-run-if-empty git rm -r --cached "{}"' \
   --prune-empty -f -- --all
于 2017-02-22T12:18:34.043 回答