19

如何从存储库中删除所有特定类型的文件?我在用着

git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

要么 git 没有扩展 glob,要么没有**按照我期望的方式扩展。

4

5 回答 5

24

您只需运行它即可从索引中删除所有 jar:

git rm -r --cached **/*.jar

从项目的根目录运行此命令,它将清理并仅从暂存区域中删除所有文件。

于 2016-08-10T20:27:16.897 回答
13

我发现最简单的方法是使用BFG Repo-Cleaner

项目页面上的说明很清楚。您将使用的命令类似于:

bfg --delete-files "*.jar"  my-repo.git

BFG 将清除所有以 .jar 扩展名结尾的文件的回购历史。然后,您可以在将结果推送回服务器之前对其进行检查。

于 2016-08-12T15:53:57.153 回答
12

对于 Git 2.24(2019 年第四季度),git filter-branch已弃用

等效的将是 usingnewren/git-filter-repo及其示例部分

cd repo
git filter-repo --path-glob '*.jar' --invert-paths

这将从存储库历史记录中删除任何 jar 文件。

于 2019-10-05T20:30:39.463 回答
8
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'

应该可以,但这有点傻,因为 git glob ( *) 匹配路径分隔符。所以,**/*.jar等价于*.jar

这也意味着*/a*.jar匹配dir1/abc/dir2/log4j.jar. 如果你想匹配类似的东西**/a*.jar(所有名称以a任何目录开头的 jars),你应该使用 find。这是一个命令,用于删除名称以aor开头的b任何 jar 以及 中的任何 jardir1/dir2以及任何目录中的任何 .txt 文件:

git filter-branch --index-filter 'git rm -rf --cached "*.txt" "dir1/dir2/*.jar" $(find -type f -name "a*.jar" -o -name "b*.jar")'

参考资料:pathspec部分git help glossary

于 2016-08-12T15:46:55.673 回答
1

虽然它不是一个 git 命令,但是对于那些对如何在 linux 机器上完成它感兴趣的人,你可以使用

git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done }

在这里,我们列出了 git index 中的所有文件,并将该输出转发给 grep 命令以仅过滤.sh文件,而不是我们执行的每个文件git rm --cached <file>

于 2016-08-12T06:56:21.927 回答