如何从存储库中删除所有类型的文件?我正在使用
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
无论是git都没有扩展globs,或者它没有像我期待的那样扩展**
。
您只需运行此命令即可从索引中删除所有jar:
git rm -r --cached **/*.jar
从项目的根目录运行此命令,它将清理并将仅从暂存区域删除所有文件。
git filter-branch --index-filter 'git rm -rf --cached **/*.jar'
应该工作,但它有点傻,因为git globs(*
)匹配路径分隔符。因此,**/*.jar
相当于*.jar
。
这也意味着*/a*.jar
匹配dir1/abc/dir2/log4j.jar
。如果你想匹配**/a*.jar
(在任何目录中名字以a
开头的所有罐子),你应该使用find。这是一个命令,用于删除名称以a
或b
开头的任何jar,以及dir1/dir2
中的任何jar,以及任何目录中的任何.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
部分。
我发现最简单的方法是使用BFG Repo-Cleaner
项目页面上的说明是清楚的。你将使用的命令是这样的:
bfg --delete-files "*.jar" my-repo.git
BFG将清除以.jar扩展名结尾的所有文件的repo的历史记录。然后,您可以在将结果推回服务器之前检查结果。
虽然它不是git命令,但对于那些对如何在linux机器上实现它感兴趣的人,你可以使用
git ls-files | grep "\.sh$" | { while IFS= read -r line; do git rm --cached "$line"; done }
这里我们列出git索引中的所有文件,并将该输出转发给grep命令,以仅过滤.sh
文件,而不是每个文件都执行git rm --cached <file>
。