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

fab*_*ien 18 git

我有一个巨大的git repo,最终想用bfg清理.
但首先,我想跟踪并删除HEAD哪个git视为二进制文件...

所以,我正在寻找的是一个命令来查找HEAD中git视为二进制文件的所有文件.

这些没有帮助:

预先感谢您的帮助.

jan*_*ler 17

diff <(git grep -Ic '') <(git grep -c '') | grep '^>' | cut -d : -f 1 | cut -d ' ' -f 2-
Run Code Online (Sandbox Code Playgroud)

打破它:

  • git grep -c ''打印存储库中每个文件的名称和行数.添加该-I选项会使命令忽略二进制文件.
  • diff <(cmd1) <(cmd2)使用进程替换来提供diff命名管道,通过它发送cmd1和输出cmd2.
  • grepcut命令用于从输出提取的文件名diff.


ben*_*bin 9

基于@jangler答案的简化解决方案(/sf/answers/2148346371/)

comm -13 <(git grep -Il '' | sort -u) <(git grep -al '' | sort -u)
Run Code Online (Sandbox Code Playgroud)

说明:

  1. git grep

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

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

  • 添加“ | xargs du -c | sort -g”以查找最大文件和二进制文件中的总空间 (2认同)

tsu*_*sul 6

以下是使用PowerShell的Windows的相同脚本:

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

foreach ($line in $allFiles){
    if ($textFiles -notcontains $line) {
        $line;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者是简短的形式:

$textFiles = git grep -Il .
git ls-files | where { $textFiles -notcontains $_ }
Run Code Online (Sandbox Code Playgroud)

这需要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
Run Code Online (Sandbox Code Playgroud)

这需要O(n)完成.


Cir*_*四事件 5

grep -Fvxf <(git grep -Il '') <(git grep -al '')
Run Code Online (Sandbox Code Playgroud)

解释:

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

grep -Fvxf <(git grep --cached -Il '') <(git grep --cached -al '')
Run Code Online (Sandbox Code Playgroud)

或者您可以git ls-files使用如何确定 Git 将文件作为二进制文件还是文本处理?

使用此测试仓库在 Git 2.16.1 上进行了测试


归档时间:

查看次数:

4113 次

最近记录:

7 年,1 月 前