Как сделать так, чтобы git Merge знал о конфликтующих идентификаторах объектов - PullRequest
0 голосов
/ 06 февраля 2020

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

Редактировать: Вот рабочий процесс, о котором я думаю:

  1. Для разработки файла xml используется внешнее программное обеспечение. Пример этого XML файла приведен ниже.
  2. Файл xml (и дополнительные файлы) находятся в папке, с которой вызывается git init.
  3. Этот репозиторий git помещается в удаленный репозиторий.
  4. Различные члены команды разветвляются / разветвляются из удаленного репозитория на своих локальных устройствах. Они вносят изменения, в том числе добавление объектов. Внешнее программное обеспечение автоматически назначает идентификаторы объектов, которые на 1 больше максимального идентификатора (для этого типа объектов).
  5. Члены команды фиксируют изменения локально, и в конечном итоге pu sh возвращаются в удаленное хранилище для слияния в главную ветвь.

  6. Как мне управлять этим слиянием, чтобы предотвратить столкновение двух идентификаторов объектов в файле XML, если два пользователя добавили один и тот же тип объекта?

Пример файла:

<net>
<ObjectAs>
<ObjectA id=1 some=thing>
<ObjectA id=2 some=else>
</ObjectAs>
<ObjectBs>
<ObjectB id=1 some=thing>
<ObjectB id=2 some=else>
</ObjectBs>
</net>

Возможный коммит из редактора A:

<net>
<ObjectAs>
<ObjectA id=1 some=thing>
<ObjectA id=2 some=else>
+++<ObjectA id=2 some=1>
</ObjectAs>
<ObjectBs>
<ObjectB id=1 some=thing>
<ObjectB id=2 some=else>
</ObjectBs>
</net>

Возможный коммит из редактора B:

<net>
<ObjectAs>
<ObjectA id=1 some=thing>
<ObjectA id=2 some=else>
+++<ObjectA id=2 some=2>
</ObjectAs>
<ObjectBs>
<ObjectB id=1 some=thing>
<ObjectB id=2 some=else>
</ObjectBs>
</net>

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

Как мне управлять этим слиянием, чтобы предотвратить столкновение двух идентификаторов объектов в файле XML, если два пользователя добавили один и тот же тип объекта?

1 Ответ

1 голос
/ 07 февраля 2020

git merge работает с текстовыми файлами. Если текст хорошо сочетается в соответствии с правилами объединения текста Git (см., Например, мой ответ на Повторяющиеся слияния в GIT. Как он рассчитывает различия? ), Git объединит их. Если нет, то не будет.

Git не понимает XML. Если вы будете sh разумно объединять XML файлов, вы должны предоставить свой собственный алгоритм объединения. Интеллектуальное объединение XML - очень сложная проблема - фактически, без схемы или чего-либо подобного, это вообще невозможно.

Вы можете Git автоматически запускать собственный алгоритм объединения, используя .gitattributes и драйвер слияния . Обратите внимание, что Git не вызовет ваш алгоритм слияния, если только одна сторона изменит файл XML; он будет использовать его, только если обе стороны изменили этот файл. (Более конкретно, только если обе "стороны" diff, наша и их, имеют низкоуровневые изменения, Git вызовут ваш драйвер. Опять же, смотрите связанный вопрос.)

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