Чи добре git у бінарних файлах?


97

Чи добре git у бінарних файлах?

Якщо у мене багато модифікованих нестиснених файлів, і багато стислих файлів ніколи (або майже ніколи) не змінюються, чи git би справлявся з цим добре? Наприклад, якщо я вставляю або виймаю середину і вставляю дані наприкінці, вона помітить це, як це робиться з текстом?

Якщо git непоганий у двійкових файлах, який інструмент я можу вважати?


1
дуже добре з бінарним - я використовую його сам
tekknolagi

Це якось правда. Ви можете поставити свій / додому під ревізію git, і він повинен працювати досить добре.
Loïc Faure-Lacroix

1
Це не в дусі питання, яке чітко було зафіксовано як стурбоване тим, чи було зроблено на них бінарні файли (можливо, з роздуття сховища та причин продуктивності). Однак я не спровокував це (і, здається, хтось з тих пір його видалив).
coreyward

1
Примітка: тепер у вас є GIT-LTS, для зберігання виконуваних файлів в іншому місці: stackoverflow.com/a/29530784/6309
VonC

1
Чи роздуває папку .git?
Нікхіл

Відповіді:


47

З вікна, git може легко додавати бінарні файли до свого індексу, а також ефективно їх зберігати, якщо ви не регулярно оновлюєте великі файли, що не стискаються.

Проблеми починаються тоді, коли git потребує генерування розрізнень та злиття: git не може генерувати значущі diff або об'єднувати бінарні файли будь-яким способом, який міг би мати сенс. Таким чином, всі злиття, повторні бази чи вишневі пікселі, пов’язані зі зміною бінарного файлу, включатимуть вручну вирішення конфлікту для цього бінарного файлу.

Вам потрібно вирішити, чи є зміни бінарного файлу досить рідкісними, щоб ви могли жити з додатковою ручною роботою, яку вони спричиняють у звичайному робочому процесі git, що включає злиття, перезавантаження, вишневі піски.


26
Мені слід зазначити, що зміни бінарних файлів не є проблемою, внесення змін у декілька місць, а потім спроба їх об'єднання є.
Вінстон Еверт

15
git може генерувати значущі відмінності. Розділ, створений за допомогою git diff --binary, зможе виправити бінарні файли.
CB Bailey

46

Окрім інших відповідей.

  • Ви можете надіслати diff у двійковий файл, використовуючи так званий бінарний формат diff . Він не є читабельним для людини, і його можна застосувати, лише якщо у вашому сховищі є точний попередній перегляд , тобто без жодної нечіткості.
    Приклад:

    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
    
  • Ви можете використовувати textconv gitattribute, щоб git diffпоказати читабельну людину різницю для бінарних файлів або частин бінарних файлів. Наприклад, для файлів * .jpg це може бути різниця в EXIF-інформації, для файлів PDF це може бути різниця між їх текстовим поданням (pdf2text або щось подібне).

HTH.


5
Велика подяка за те, що ви навчали мене про гіттабуліти! Відкриває цілком новий світ можливостей.
hermannloose

15

Якщо у вас дійсно великі двійкові файли, ви можете використовувати git-annex для зберігання даних поза сховищем. Перевірте: http://git-annex.branchable.com/


6
Git-annex досить чудовий, але, ймовірно, краще підходить для файлів, які часто не змінюють , наприклад колекцію музичних файлів, картинок, PDF-файлів, ...
sr_

@sr_ точно, як і Git LFS. Здається, не існує системи управління версіями, яка підходить для таких типів випадків використання, в той час як також є розподілена система в якості бази (як Git).
Марк Дж. Шмідт

5

Я не знаю жодних інструментів, які намагаються зберігати різні бінарні файли для контролю версій, але варто зазначити, що Git не робить цього навіть для текстових файлів. Git зберігає файли як краплі, і він робить різницю між ними, коли потрібно.

Якщо ви хочете виконати контроль версій на чомусь на зразок документів Photoshop / Illustrator, GridIron Flow може зробити для вас хитрість. Якщо ви намагаєтеся синхронізувати їх між машинами, Dropbox або Rsync можуть впоратися з цим, але вони не збираються робити інтелектуальні розробки.


1
З книги спільноти git ( book.git-scm.com/7_how_git_stores_objects.html ): "Щоб заощадити цей простір, Git використовує пакетний файл. Це формат, де Git збереже лише ту частину, яка була змінена у другому файлі , з вказівником на файл, на який він схожий. "
Уейн Конрад

2
Так, це якщо / коли ви біжите git gcробити вивезення сміття. З тієї ж сторінки: "Оскільки Git зберігає кожну версію кожного файлу як окремий об'єкт, він може стати досить неефективним. Уявіть, що файл має кілька тисяч рядків і змінює один рядок. Git буде зберігати другий файл у повному обсязі, який це велика велика трата простору ".
coreyward

2
Справедливий нюх. git робить gc автоматично раз у раз, принаймні для проекту, для якого я його використовую. Я не знаю, яку метрику він використовує, щоб вирішити, коли запустити - можливо, є дерева, які ніколи (або рідко) запускають gc.
Уейн Конрад

1
На головній сторінці сайту git gc: "Користувачам рекомендується регулярно виконувати це завдання у кожному сховищі, щоб підтримувати хороше використання дискового простору та хороші експлуатаційні показники. Деякі команди git можуть автоматично запускати git gc; для деталей див. Прапор --auto нижче . "
Якоб Аккербум

1
@KennyEvitt Зараз є тонна. Анотація - це одне, а Кактус - інший, який використовує git за кадром.
coreyward

3

Добре git добре з бінарними файлами. Але він не обробляє двійкові файли, як текстові файли. Це як ви хочете об'єднати бінарні файли. Я маю на увазі, різниця на jpeg ніколи вам нічого не поверне. Git дуже добре працює з текстовим файлом і, ймовірно, так само погано, як і будь-яке інше рішення з бінарними файлами!


2

якщо ви хочете рішення для версії, ви можете розглянути git-lfs, який має легкий покажчик на ваш файл.

це означає, що коли ви клонуєте репо, він не завантажує всі версії, а лише ті, що перевірені.

Ось хороший підручник, як ним користуватися

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.