Git хорош с двоичными файлами?


101

Git хорош с двоичными файлами?

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

Если git плохо работает с двоичными файлами, какой инструмент я могу рассмотреть?


1
очень хорошо работает с двоичным
кодом

Это правда. Вы можете поместить свой / home под git revision, и он должен работать хорошо.
Лоик Фор-Лакруа

1
Это не в духе вопроса, который был четко отмечен как обеспокоенный тем, есть ли в двоичных файлах различие (вероятно, из-за раздувания репозитория и соображений производительности). Однако я не проголосовал за него (и, похоже, тот, кто это сделал, с тех пор удалил его).
coreyward

1
Примечание: теперь у вас есть git-lts для хранения ваших двоичных файлов в другом месте: stackoverflow.com/a/29530784/6309
VonC

1
Раздувает ли он папку .git?
Porcupine

Ответы:


49

По умолчанию git может легко добавлять двоичные файлы в свой индекс, а также эффективно хранить их, если вы не выполняете частые обновления больших несжимаемых файлов.

Проблемы начинаются, когда git необходимо генерировать различия и слияния: git не может генерировать значимые различия или объединять двоичные файлы любым разумным способом. Таким образом, все слияния, перестановки или выборки, связанные с изменением двоичного файла, потребуют от вас ручного разрешения конфликтов в этом двоичном файле.

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


27
Я должен отметить, что изменения в двоичных файлах не являются проблемой, если внести изменения в нескольких местах, а затем попытаться их объединить.
Уинстон Эверт

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

47

В дополнение к другим ответам.

  • Вы можете отправить разницу в двоичный файл, используя так называемый двоичный формат сравнения . Он не читается человеком и может быть применен только в том случае, если у вас есть точный прообраз в вашем репозитории, то есть без какого-либо нечеткости.
    Пример:

    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
Большое спасибо за то, что научили меня gitattributes! Открывает целый новый мир возможностей.
hermannloose

15

Если у вас действительно большие двоичные файлы, вы можете использовать git-application для хранения данных вне репозитория. Проверить: http://git-annex.branchable.com/


6
Git-application довольно замечательно, но, вероятно, лучше подходит для файлов, которые не так часто меняются , например, коллекции музыкальных файлов, изображений, PDF-файлов, ...
sr_ 05

@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 Сейчас их целая тонна. Abstract - это одно, а Kactus - другое, которое использует git за кулисами.
coreyward 09

4

Что ж, git хорош с двоичными файлами. Но он не будет обрабатывать двоичные файлы, такие как текстовые файлы. Это похоже на то, что вы хотите объединить двоичные файлы. Я имею в виду, что разница в формате jpeg никогда вам ничего не вернет. Git очень хорошо работает с текстовым файлом и, вероятно, так же плохо, как и любое другое решение с двоичными файлами!


2

если вам нужно решение для управления версиями, вы можете рассмотреть git-lfs , у которого есть легкий указатель на ваш файл.

это означает, что когда вы клонируете свое репо, оно загружает не все версии, а только ту, которая проверена.

Вот хороший урок о том, как его использовать

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.