Найти все двоичные файлы в git HEAD

У меня есть огромный репозиторий git, который в конечном итоге хочет очистить bfg.
Но сначала я хочу отслеживать и удалять файлы в HEAD, который git рассматривает как двоичный...

Итак, я ищу команду , чтобы найти все файлы в HEAD, которые git обрабатывает как двоичный.

Это не помогло:

Заранее благодарим вас за помощь.

Ответ 1

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

Разрушение:

  • git grep -c '' печатает имена и количество строк каждого файла в репозитории. Добавление опции -I заставляет команду игнорировать двоичные файлы.
  • diff <(cmd1) <(cmd2) использует подстановку процессов для предоставления diff именованным каналам, через которые отправляются выходные данные cmd1 и cmd2.
  • Команды grep и cut используются для извлечения имен файлов из вывода diff.

Ответ 2

Упрощенное решение, основанное на ответе @jangler (fooobar.com/questions/446737/...)

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

Ответ 3

grep -Fvxf <(git grep --cached -Il '';
             git config --file .gitmodules --get-regexp path | awk '{ print $2 }';) \
           <(git ls-files)

Пояснение:

Или вы можете сделать цикл for на git ls-files с помощью Как определить, обрабатывает ли файл git двоичный файл или текст?

Ответ 4

Вот такой же script для Windows с помощью PowerShell:

$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), и это быстрый подход с использованием hashtables:

$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).