2015-06-07 11 views
12

Mam ogromne repozytorium git, które ostatecznie chce posprzątać z bfg.
Ale najpierw chcę, aby wytropić i usunąć pliki w git HEAD które traktuje jako binarne ...Znajdź wszystkie pliki binarne w git HEAD

Więc, co szukam jest polecenie, aby znaleźć wszystkie pliki w HEAD że git traktuje jako plik binarny.

To nie pomogło:

Z góry dziękuję za pomoc.

Odpowiedz

13

złamanie go:

  • git grep -c '' wypisuje nazwy i liczby wiersz każdego pliku w repozytorium. Dodanie opcji -I powoduje, że polecenie ignoruje pliki binarne.
  • diff <(cmd1) <(cmd2) wykorzystuje proces zastępowania w celu zapewnienia diff z nazwanymi rurami, przez które wysyłane są dane wyjściowe cmd1 i cmd2.
  • Komendy grep i cut służą do wyodrębniania nazw plików z wyjścia diff.
+0

Aby poprawnie zająć się białymi znakami w nazwach plików, możesz zmienić flagę 'c' na' l' jak na przykład: 'diff <(git grep -Il ''" $ commit ") <(git grep -l ' "" $ commit ") | grep '^>' | cut -d ':' -f2-' – sinelaw

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

Objaśnienie:

Albo chould zrobić dla pętli na git ls-files z How to determine if Git handles a file as binary or as text?

+0

Ten zawiera submoduły na liście – sinelaw

2

Tutaj jest ten sam skrypt Windows przy użyciu PowerShell:

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

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

Lub w shor Forma I:

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

To wymaga O(n^2) do wypełnienia, i jest szybsze podejście z użyciem 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 

To wymaga O(n) do zakończenia.

4

Uproszczone rozwiązanie oparte na odpowiedź od @jangler (https://stackoverflow.com/a/30690662/808101)

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

Objaśnienie:

  1. git grep

    • -l Zapytaj tylko wydrukować nazwę pliku dopasowywania plików wzór '' (który sho mecz uld z każdej linii każdego pliku)
    • -I Ta opcja sprawia, że ​​polecenie ignorowania plików binarnych
    • -a Siła ta opcja przetwarzanie plików binarnych, jak gdyby były tekst
  2. sort -u Sortuj wynik z grep, ponieważ comm tylko proces posortowane pliki

  3. comm -13 listę plików, które są wspólne zarówno git grep