在 git HEAD 中查找所有二进制文件

28

我有一个巨大的Git仓库,最终想要使用bfg来进行清理。
但首先,我想要找出并删除Git将其视为二进制文件的HEAD中的文件...

所以,我正在寻找一个命令,可以找到Git在HEAD中将其视为二进制的所有文件

以下内容没有帮助:

感谢您的帮助。

5个回答

31
diff <(git grep -Ic '') <(git grep -c '') | grep '^>' | cut -d : -f 1 | cut -d ' ' -f 2-

分解一下:

  • git grep -c '' 打印存储库中每个文件的名称和行数。添加 -I 选项可以使命令忽略二进制文件。
  • diff <(cmd1) <(cmd2) 使用进程替换为 diff 提供了通过其中传输 cmd1cmd2 的输出的命名管道。
  • 使用 grepcut 命令从 diff 的输出中提取文件名。

为了正确处理文件名中的空格,您可以将 c 标志更改为 l,如下所示:diff <(git grep -Il '' "$commit") <(git grep -l '' "$commit") | grep '^>' | cut -d':' -f2- - sinelaw
你要如何使用管道将此命令传输给 list 命令来获取每个文件的文件大小? - Chris F
我明白了,只需使用 | xargs du -ch {} + - Chris F
我们如何将此更改为命令的历史版本?也就是说,获取存储库历史记录中曾经存在的所有二进制文件? - plalanne

16

基于@jangler的答案(https://dev59.com/DV0a5IYBdhLWcg3wH1ly#30690662)的简化解决方案。

comm -13 <(git grep -Il '' | sort -u) <(git grep -al '' | sort -u)

解释:

  1. git grep

    • -l 要求只打印匹配模式 '' 的文件名(应该匹配每个文件的每一行)
    • -I 这个选项让命令忽略二进制文件
    • -a 这个选项将强制处理二进制文件,就像它们是文本一样
  2. sort -ugit grep 的结果进行排序,因为 comm 只能处理已排序的文件

  3. comm -13 列出第2个列表(包括二进制文件的 git grep 列表)中唯一的文件


2
在二进制文件中查找最大的文件和总空间,请添加“| xargs du -c | sort -g”。 - Raúl Salinas-Monteagudo

9

以下是使用PowerShell编写的Windows平台上相同的脚本:

$textFiles = git grep -Il .
$allFiles = git ls-files

foreach ($line in $allFiles){
    if ($textFiles -notcontains $line) {
        $line;
    }
}

简要概述:

$textFiles = git grep -Il .
git ls-files | where { $textFiles -notcontains $_ }

这个操作需要 O(n^2) 的时间才能完成,但是使用哈希表可以更快地解决问题:

$files = @{}
git ls-files | foreach { $files[$_] = 1 }
git grep -Il . | foreach { $files[$_] = 0 }
$files.GetEnumerator() | where Value -EQ 1 | sort Name | select -ExpandProperty Name

这需要 O(n) 的时间才能完成。


7
grep -Fvxf <(git grep -Il '') <(git grep -al '')

解释:

还要考虑使用git add添加但尚未提交的文件:

grep -Fvxf <(git grep --cached -Il '') <(git grep --cached -al '')

你可以使用git ls-files的for循环,结合如何确定Git将文件处理为二进制文件还是文本文件?

在Git 2.16.1版本中进行了测试,使用此测试存储库


这个列表包括子模块。 - sinelaw

0

快速、简便,但准确性不确定:

git ls-files -eol

任何被标记为i/-text的文件通常会被视为二进制文件。


git ls-files --eol - Sander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接