Czy git jest dobry w przypadku plików binarnych?

101

Czy git jest dobry w przypadku plików binarnych?

Jeśli mam wiele nieskompresowanych plików, które są modyfikowane, a wiele skompresowanych plików nigdy (lub prawie nigdy) nie jest modyfikowanych, czy git sobie z tym poradzi? Na przykład, jeśli wstawię lub usunę środek i wstawię dane pod koniec, zauważy to tak, jak w przypadku tekstu?

Jeśli git nie radzi sobie dobrze z plikami binarnymi, jakie narzędzie mogę rozważyć?

Wymuskany
źródło
1
bardzo dobrze z binarnymi - sam go używam
tekknolagi
To trochę prawda. Możesz umieścić swój / home w wersji git i powinno działać całkiem dobrze.
Loïc Faure-Lacroix
1
Nie jest to zgodne z duchem pytania, które zostało wyraźnie zauważone jako zaniepokojenie tym, czy pliki binarne mają na sobie różnice (prawdopodobnie ze względu na powiększenie repozytorium i wydajność). Jednak nie przegłosowałem tego (i wydaje się, że ktokolwiek to zrobił, od tego czasu go usunął).
coreyward
1
Uwaga: masz teraz git-lts, aby przechowywać pliki binarne w innym miejscu: stackoverflow.com/a/29530784/6309
VonC
1
Czy powoduje nadmuchanie folderu .git?
Jeżozwierz

Odpowiedzi:

49

Po wyjęciu z pudełka git może z łatwością dodawać pliki binarne do swojego indeksu, a także przechowywać je w efektywny sposób, chyba że często aktualizujesz duże niekompresowalne pliki.

Problemy zaczynają się, gdy git musi generować różnice i scalać: git nie może generować znaczących różnic ani łączyć plików binarnych w jakikolwiek sposób, który mógłby mieć sens. Zatem wszystkie scalenia, zmiany bazy lub algorytmy szyfrowania obejmujące zmianę w pliku binarnym będą wymagały ręcznego rozwiązywania konfliktów w tym pliku binarnym.

Musisz zdecydować, czy zmiany w plikach binarnych są na tyle rzadkie, że możesz żyć z dodatkową pracą ręczną, jaką powodują w normalnym przepływie pracy git, obejmującym scalanie, ponowne bazy danych, cherrypicks.

ndim
źródło
27
Musiałbym zwrócić uwagę, że zmiany plików binarnych nie stanowią problemu, wprowadzanie zmian w wielu miejscach, a następnie próba ich scalenia jest.
Winston Ewert,
15
git może generować znaczące różnice. Różnica utworzona za pomocą git diff --binarybędzie mogła łatać pliki binarne.
CB Bailey,
46

Oprócz innych odpowiedzi.

  • Możesz wysłać plik różnicowy do pliku binarnego przy użyciu tzw. Formatu binarnego . Nie jest czytelny dla człowieka i można go zastosować tylko wtedy, gdy masz w repozytorium dokładny obraz wstępny, tj. Bez żadnego fuzza.
    Przykład:

    diff --git a/gitweb/git-favicon.png b/gitweb/git-favicon.png
    index de637c0608090162a6ce6b51d5f9bfe512cf8bcf..aae35a70e70351fe6dcb3e905e2e388cf0cb0ac3 100
    GIT binary patch
    delta 85
    zcmZ3&SUf?+pEJNG#Pt9J149GD|NsBH{?u>)*{Yr{jv*Y^lOtGJcy4sCvGS>LGzvuT
    nGSco!%*slUXkjQ0+{(x>@rZKt$^5c~Kn)C@u6{1-oD!M<s|Fj6
    
    delta 135
    zcmXS3!Z<;to+rR3#Pt9J149GDe=s<ftM(tr<t*@sEM{Qf76xHPhFNnYfP!|OE{-7;
    zjI0MY3OYE5upapO?DR{I1pyyR7cx(jY7y^{FfMCvb5IaiQM`NJfeQjFwttKJyJNq@
    hveI=@x=fAo=hV3$-MIWu9%vGSr>mdKI;RB2CICA_GnfDX
    
  • Możesz użyć textconv gitattribute, aby git diffwyświetlić różnice w postaci czytelnej dla człowieka dla plików binarnych lub części plików binarnych. Na przykład w przypadku plików * .jpg może to być różnica w informacjach EXIF, w przypadku plików PDF może to być różnica między ich reprezentacją tekstową (pdf2text lub coś w tym rodzaju).

HTH.

Jakub Narębski
źródło
5
Wielkie dzięki za nauczenie mnie o gitattributes! Otwiera zupełnie nowy świat możliwości.
hermannloose
15

Jeśli masz naprawdę duże pliki binarne, możesz użyć git-Annex do przechowywania danych poza repozytorium. Sprawdź: http://git-annex.branchable.com/

John Gibb
źródło
6
Git-Annex jest całkiem cudowny, ale prawdopodobnie lepiej nadaje się do plików, które nie zmieniają się zbyt często , np. Zbiór plików muzycznych, zdjęć, PDF-ów, ...
sr_
@sr_ dokładnie, podobnie jak Git LFS. Wygląda na to, że nie ma systemu kontroli wersji odpowiedniego dla tego typu przypadków użycia, mając jednocześnie system rozproszony jako podstawę (jak Git).
Marc J. Schmidt
5

Nie znam żadnych narzędzi, które próbują przechowywać różnice plików binarnych do kontroli wersji, ale warto zauważyć, że Git nie robi tego nawet dla plików tekstowych. Git przechowuje pliki jako obiekty blob i dokonuje różnic między nimi, gdy jest to konieczne.

Jeśli chcesz kontrolować wersję w dokumentach programu Photoshop / Illustrator, GridIron Flow może załatwić sprawę za Ciebie. Jeśli próbujesz zsynchronizować je między maszynami, Dropbox lub Rsync poradzą sobie z tym, ale nie będą robić inteligentnego porównywania.

coreyward
źródło
1
Z książki społeczności git ( book.git-scm.com/7_how_git_stores_objects.html ): „Aby zaoszczędzić miejsce, Git wykorzystuje plik pakietu. Jest to format, w którym Git zapisze tylko część, która uległa zmianie w drugim pliku , ze wskaźnikiem do pliku, do którego jest podobny. "
Wayne Conrad,
2
Tak, to jest jeśli / kiedy biegniesz, git gcaby zbierać śmieci. Z tej samej strony: „Ponieważ Git przechowuje każdą wersję każdego pliku jako osobny obiekt, może to stać się dość nieefektywne. Wyobraź sobie, że plik ma kilka tysięcy linii i zmienia się w pojedynczą linię. Git zapisze drugi plik w całości, co to ogromna strata miejsca ”.
coreyward
2
Fair 'nuff. git od czasu do czasu automatycznie wykonuje gc, przynajmniej w przypadku projektu, do którego go używam. Nie wiem, jakiej metryki używa, aby zdecydować, kiedy uruchomić - być może istnieją drzewa, które nigdy (lub rzadko) wywołałyby gc.
Wayne Conrad
1
Ze strony podręcznika podręcznika git gc: „Użytkownicy są zachęcani do regularnego uruchamiania tego zadania w każdym repozytorium, aby zachować dobre wykorzystanie miejsca na dysku i dobrą wydajność operacyjną. Niektóre polecenia git mogą automatycznie uruchamiać git gc; zobacz flagę --auto poniżej, aby uzyskać szczegółowe informacje ”.
Jacob Akkerboom
1
@KennyEvitt Jest teraz mnóstwo. Streszczenie to jedno, a Kactus to drugie, które używa git za kulisami.
coreyward
4

Cóż, git jest dobry w przypadku plików binarnych. Ale nie obsługuje plików binarnych, takich jak pliki tekstowe. To tak, jakbyś chciał scalić pliki binarne. Chodzi mi o to, że różnica na jpeg nigdy ci nic nie zwróci. Git działa bardzo dobrze z plikiem tekstowym i prawdopodobnie tak źle, jak każde inne rozwiązanie z plikami binarnymi!

Loïc Faure-Lacroix
źródło
2

jeśli potrzebujesz rozwiązania do wersjonowania, możesz rozważyć git-lfs, który ma lekki wskaźnik do twojego pliku.

oznacza to, że kiedy klonujesz repozytorium, nie pobiera ono wszystkich wersji, ale tylko tę, która jest wyewidencjonowana.

Oto fajny samouczek, jak go używać

danfromisrael
źródło