Блокировка двоичных файлов с помощью системы управления версиями git

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

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

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

ПРИМЕЧАНИЕ. Похоже, что проект Source Gear с открытым исходным кодом, управляемый версией, Veracity, имеет блокировку в качестве одной из своих целей.

Ответ 1

Git LFS 2.0 добавила поддержку блокировки файлов.

С помощью Git LFS 2.0.0 теперь вы можете блокировать файлы, над которыми вы активно работаете, не позволяя другим пользователям переходить на сервер LFS Git, пока вы не разблокируете файлы снова.

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

Ответ 2

Subversion имеет блокировки, и они не просто консультативны. Они могут быть применены с использованием атрибута svn:needs-lock (но также могут быть намеренно разбиты, если необходимо). Это правильное решение для управления неизмеримыми файлами. Компания, которую я работаю для магазинов почти всего в Subversion, и использует svn:needs-lock для всех неизмеримых файлов.

Я не согласен с тем, что "блокировки - это просто метод коммуникации". Они гораздо эффективнее, чем push-уведомления, такие как телефон или электронная почта. Блокировки субверсии самодокументированы (у кого есть блокировка). С другой стороны, если вам нужно обмениваться данными другими традиционными каналами push-уведомлений, такими как электронная почта, на которые вы отправляете уведомление? Вы не знаете заранее, кто может захотеть отредактировать файл, особенно в проектах с открытым исходным кодом, если у вас нет полного списка всей команды разработчиков. Таким образом, эти традиционные методы коммуникации не так эффективны.

Центральный сервер блокировки, в то время как против принципов DVCS, является единственным допустимым методом для неизмеримых файлов. Пока DVCS не имеет функции центрального замка, я думаю, что он будет поддерживать компанию, с которой я работаю, для использования Subversion.

Лучшим решением было бы сделать инструмент слияния для всех ваших двоичных форматов файлов, но это долгосрочная и постоянная цель, которая никогда не будет "завершена".

Здесь интересно прочитать по теме.

Ответ 3

Я согласен, что блокировка двоичных файлов является необходимой функцией для некоторых сред. Я просто подумал о том, как реализовать это, хотя:

  • Уметь выделять файл как "блокировку потребностей" (например, свойство "svn: needs-lock" ).
  • При проверке git отметит такой файл как доступный только для чтения.
  • Новая команда git-lock свяжется с сервером центрального замка, где-то где-то, чтобы запросить разрешение на блокировку.
  • Если сервер блокировки предоставляет разрешение, отметьте файл read-write.
  • git-add сообщит сервер блокировки хеша содержимого заблокированного файла.
  • Сервер блокировки будет следить за тем, чтобы хэш содержимого отображался в фиксации в основном репозитории.
  • Когда появится хеш, отпустите блокировку.

Это очень наполовину испеченная идея, и во всем мире есть потенциальные дыры. Это также противоречит духу git, но в некоторых контекстах оно может быть полезным.

В рамках конкретной организации возможно создание такого рода с использованием подходящей комбинации оберток script и фиксации фиксации.

Ответ 4

В ответ на Марио дополнительную озабоченность изменениями, происходящими в нескольких местах в двоичных файлах. Таким образом, сценарий - Алиса и Боб одновременно вносят изменения в один и тот же двоичный ресурс. Каждый из них имеет свое собственное местное репо, клонированное с одного центрального пульта.

Это действительно потенциальная проблема. Итак, Алиса сначала заканчивается и толкает центральную ветвь alice/update. Обычно, когда это происходит, Алиса объявляет, что ее следует пересмотреть. Боб видит это и рассматривает его. Он может либо (1) включить эти изменения в свою версию (разветвление от alice/update и внесение в нее изменений), либо (2) опубликовать свои собственные изменения на bob/update. Опять же, он делает объявление.

Теперь, если Алиса подталкивает к master вместо этого, у Боба есть дилемма, когда он тянет master и пытается слиться в свою локальную ветвь. Его конфликты с Алисой. Но опять же, такая же процедура может применяться, как раз на разных ветвях. И даже если Боб игнорирует все предупреждения и совершает действия над Алисой, всегда можно вытащить Алису за то, что она исправит ситуацию. Это становится просто проблемой связи.

Поскольку (AFAIK) блокировки Subversion являются просто рекомендательными, сообщение электронной почты или мгновенное сообщение могут служить той же цели. Но даже если вы этого не сделаете, Git позволяет исправить его.

Нет, нет механизма блокировки как такового. Но механизм блокировки обычно просто заменяет хорошую связь. Я считаю, что разработчики Git не добавили механизм блокировки.

Ответ 5

Мы только что начали использовать Git (ранее использовав Subversion), и я нашел изменение в рабочем процессе, которое может помочь в вашей проблеме, без необходимости блокировки. Он использует преимущества дизайна Git и того, насколько удобны ветки.

В основном, это сводится к нажатию на не-ведущую ветвь, выполнение обзора этой ветки, а затем слияние в главную ветку (или в зависимости от того, какая ветвь цели).

Способ Git "предназначен" для использования, каждый разработчик публикует свой собственный публичный репозиторий, который они требуют от других. Я обнаружил, что пользователи Subversion имеют проблемы с этим. Таким образом, мы нажимаем на деревья ветвей в центральном репозитории, каждый из которых имеет собственное дерево ветвей. Например, такая иерархия может работать:

users/a/feature1
users/a/feature2
users/b/feature3
teams/d/featurey

Не стесняйтесь использовать свою собственную структуру. Примечание. Я также показываю ветки темы, другую общую идиому Git.

Затем в локальном репо для пользователя a:

feature1
feature2

И получить его на центральный сервер (источник):

git push origin feature1:users/a/feature1

(возможно, это упростится при изменении конфигурации)

В любом случае, после того, как будет рассмотрена функция1, кто бы ни был ответственен (в нашем случае это разработчик этой функции, у вас может быть один пользователь, ответственный за слияния с master файлом), делает следующее:

git checkout master
git pull
git merge users/name/feature1
git push

Притяжение делает выборку (вытаскивание любых новых основных изменений и ветки свойств) и мастера обновлений для того, что имеет центральный репозиторий. Если пользователь выполнил свою работу и правильно отслеживал мастер, проблем с слиянием не должно быть.

Все это означает, что даже если пользователь или удаленная команда вносит изменения в двоичный ресурс, он проверяется перед включением в основную ветвь. И есть четкое разграничение (основанное на процессе), когда что-то входит в главную ветвь.

Вы также можете программно применять аспекты этого использования с помощью Git hooks, но опять же, я еще не работал с ними, поэтому не могу говорить на них.

Ответ 6

Когда я использовал Subversion, я религиозно устанавливал свойство svn:needs-lock для всех двоичных и даже труднодоступных для редактирования текстовых файлов. Я никогда не испытывал конфликтов.

Теперь, в Git, я не беспокоюсь о таких вещах. Помните: блокировки в Subversion на самом деле не являются обязательными блокировками, они просто коммуникационные инструменты. И угадайте, что: мне не нужно Subversion для общения, я могу отлично справиться с E-Mail, телефоном и IM.

Еще одна вещь, которую я сделал, заключается в замене многих двоичных форматов текстовыми форматами. Я использую reStructuredText или LaT & Epsilon; & Chi; вместо Word, CSV вместо Excel, ASCII-Art вместо Visio, YAML вместо баз данных, SVG вместо OO Draw, abc вместо MIDI и т.д.

Ответ 7

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

Ответ 8

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

Ответ 9

TortoiseGit поддерживает полный рабочий процесс git для документов Office, делегирующих diff самому Office. Он также выполняет функции делегирования форматов OpenOffice для OpenDocument.

Ответ 10

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

Кажется, я помню, как кто-то говорил (или даже реализовал) поддержку слияния документов OpenOffice в git.

Ответ 11

Как насчет файлов cad? Если файлы не заблокированы, чтобы их можно было читать только для чтения, большинство программ для кэдов просто открывали бы им замену произвольных битов, рассматриваемых как новый файл любым vcs. Поэтому, на мой взгляд, блокировка - идеальное средство для обмена информацией о намерениях изменить какой-либо файл particalur. Кроме того, это мешает некоторому Программному обеспечению получить доступ на запись в первую очередь. Это позволяет обновлять локальные файлы без необходимости полностью закрыть программное обеспечение или, по крайней мере, все файлы.

Ответ 12

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

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

Ответ 13

Просто поместите текстовый файл в cc с файлом, который вы хотите заблокировать, а затем попробуйте удалить его.

Ответ 14

Возможно, что реорганизация проекта может помочь избежать блокировок, но:

  • Команды также организованы по другим приоритетам (местоположение, клиенты,...).
  • Инструменты также выбираются другими объектами (совместимость, цена, простота использования большинством сотрудников).
  • Невозможно избежать некоторых инструментов (и, следовательно, бинарных файлов), так как просто нет замены, которая может выполнять одну и ту же работу, подходящую для потребностей компании по той же цене.

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

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

Ответ 15

Это не решение, а комментарий о том, зачем нужны механизмы блокировки. Существуют некоторые инструменты, используемые в некоторых областях, которые используют двоичные только форматы, которые являются плоскими критически важными, а "использовать лучшие/разные инструменты" просто не вариант. Нет жизнеспособных альтернативных инструментов. Те, с которыми я знаком, действительно не будут кандидатами на слияние, даже если вы сохранили ту же информацию в формате ascii. Одно из возражений, которое я слышал, это то, что вы хотите работать в автономном режиме. Конкретный инструмент, о котором я думаю, действительно не работает в автономном режиме в любом случае из-за необходимости вытаскивать лицензии, поэтому, если у меня есть данные на ноутбуке, это не похоже на то, что я могу запустить инструмент во время поезда. Тем не менее, что git обеспечивает, если у меня медленное соединение, я могу получить лицензии, а также сменить изменения, но иметь быструю локальную копию для просмотра разных версий. Это хорошая вещь, которую DVCS дает вам даже в этом случае.

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

Подход типа "консультация-блокировка по почте" действительно воняет. Я видел это и устал от бесконечного потока писем "Я его редактирую" "Я закончил редактирование" и увидел, что из-за этого произошли потери. Частный случай, о котором я думаю, был тем, где коллекция меньших файлов ascii была бы намного приятнее, но в стороне.

Ответ 16

Я не предлагаю использовать git в моей компании для той же проблемы. Мы используем EA для всех наших проектов и Microsoft Word для документации, мы не знаем заранее, кто может редактировать конкретный файл, поэтому эксклюзивная блокировка - это наш единственный вариант.

Ответ 17

Git не предоставляет никакой команды для блокировки файлов, но я финансирую способ достижения этой функции с помощью git hooks. Для хранения информации о блокировке необходим вспомогательный сервер. Мы можем использовать привязку до фиксации, чтобы проверить, заблокирован ли какой-либо зафиксированный файл. И если кто-то блокирует файл, программа должна сообщить вспомогательному серверу информацию о шкафчике и заблокированном файле.