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

bhmjp9jg  于 2022-10-23  发布在  Git
关注(0)|答案(5)|浏览(173)

我有一个巨大的git回购,最终想用bfg清理。
但首先,我想跟踪并删除HEAD中的文件,git将其视为二进制文件。。。
所以,我要找的是一个命令,它可以在HEAD中找到git视为二进制的所有文件。
这些都没有帮助:

提前感谢你的帮助。

dw1jzc5e

dw1jzc5e1#

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的输出中提取文件名。
fnvucqvd

fnvucqvd2#

基于@jangler(https://stackoverflow.com/a/30690662/808101)答案的简化解决方案

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

说明:

  • git grep
  • -l要求只打印与模式''匹配的文件名(该模式应与每个文件的每行匹配)
  • -I此选项使命令忽略二进制文件
  • -a此选项强制将二进制文件当作文本处理
  • sort -u对grep的结果进行排序,因为comm只处理已排序的文件
  • comm -13列出第二个列表中唯一的文件(git grep列表中包含所有文件,包括二进制文件)
64jmpszr

64jmpszr3#

下面是使用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)才能完成。

vhipe2zx

vhipe2zx4#

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

说明:

  • git grep -Il '':列出git认为是文本的所有非空常规文件。另请参阅:如何列出git存储库中的所有文本(非二进制)文件?
  • git grep -al '':列出所有非空常规文件,包括二进制文件
  • grep -Fvxf:选择文件2中没有出现在文件1中的行,因此只选择Git认为是二进制的非空文件。参见:How to remove the lines which appear on file B from another file A?

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

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

或者您可以使用How to determine if Git handles a file as binary or as text?git ls-files执行for循环
使用this test repo在Git 2.16.1上测试。

np8igboo

np8igboo5#

快速、简单、不确定准确度:
git ls-files -eol
标记为i/-text的任何内容都可能被视为二进制文件。

相关问题