Git и Mercurial обрабатывают двоичные файлы с помощью aplomb.Они не портят их, и вы можете проверить их и выйти.Проблема заключается в размере.
Источник обычно занимает меньше места, чем двоичные файлы.У вас может быть 100 КБ исходных файлов, которые создают бинарный файл размером 100 МБ.Таким образом, хранение одной сборки в моем репозитории может привести к увеличению его размера в 30 раз.
И это еще хуже:
Системы контроля версий обычно хранят файлы в какой-либо форме diff-формата.Допустим, у меня есть файл из 100 строк, и каждая строка в среднем содержит около 40 символов.Весь этот файл имеет размер 4 КБ.Если я изменю строку в этом файле и сохраню это изменение, я добавлю только около 60 байт к размеру моего хранилища.
Теперь, скажем, я скомпилировал и добавил этот файл размером 100 МБ.Я делаю изменения в моем источнике (может быть, 10K или около того в изменениях), перекомпилирую и сохраняю новую двоичную сборку.Ну, бинарные файлы обычно не очень хорошо различаются, так что вполне вероятно, что я добавляю еще 100Мб в мой репозиторий.Выполните несколько сборок, и размер моего хранилища увеличится до нескольких гигабайт, но исходная часть моего хранилища составляет всего несколько десятков килобайт.
Проблема с Git и Mercurial заключается в том, что вы обычно извлекаете всюхранилище на вашу систему.Вместо того, чтобы просто загружать несколько десятков килобайт, которые можно передать за несколько секунд, я сейчас загружаю несколько гигабайт сборок вместе с несколькими десятками килобайт данных.
Может быть, люди говорят, что Subversion лучше, так как я могу простоОформите нужную мне версию в Subversion, а не загружайте весь репозиторий.Однако Subversion не дает вам простого способа удалить устаревшие двоичные файлы из вашего репозитория, поэтому ваш репозиторий будет расти и расти в любом случае.Я все еще не рекомендую это.Черт возьми, я даже не рекомендую это делать, даже если система контроля версий позволяет вам удалять старые версии устаревших двоичных файлов.(Perforce, ClearCase и CVS все делают).Это просто приводит к большой головной боли при обслуживании.
Это не значит, что вы не должны хранить любые двоичные файлы.Например, если я делаю веб-страницу, у меня, вероятно, есть несколько GIF-файлов и JPEG, которые мне нужны.Не проблема хранить их в Subversion или Git / Mercurial.Они относительно малы и, вероятно, меняются намного меньше, чем сам мой код.
То, что вы не должны хранить, это встроенные объекты.Они должны храниться в репозитории релизов и извлекаться по мере необходимости.Maven и Ant w / Ivy отлично справляются с этой задачей.И вы также можете использовать структуру репозитория Maven в проектах C, C ++ и C #.