Найти все двоичные файлы в 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)
.