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ć?
Odpowiedzi:
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.
źródło
git diff --binary
będzie mogła łatać pliki binarne.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:
Możesz użyć textconv gitattribute, aby
git diff
wyś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.
źródło
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/
źródło
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.
źródło
git gc
aby 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 ”.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 ”.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!
źródło
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ć
źródło