Подтвердить что ты не робот

Как обрабатывать xml/html в рабочем процессе Feature Feature git?

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

Но материал xml/html работает не очень хорошо. Простые несвязанные изменения (дизайнер, добавляющий окружающий div, разработчик, изменяющий идентификатор элемента внутри) дает действительно катастрофические слияния.

Я понимаю, что может быть несколько вариантов того, как справиться с этим. Хорошее git xml merge было бы оптимальным или помещало бы ограничения на переформатирование кода xml/html другого. Не работая в такой близости, это будет другой (неприемлемый) вариант.

Как вы эффективно решаете эту проблему?

4b9b3361

Ответ 1

Git разрешает настраиваемые драйверы слияния, выбранные через gitattributes для каждого пути (например, для всех *.xml).

То, что вам нужно найти, это XML-совместимый драйвер слияния, а также, возможно, также написать простой script для преобразования между соглашениями Git и упомянутыми соглашениями о слиянии. Например, XML::Merge модуль Perl. Существует XyDiff, но похоже, что ему не хватает трехстороннего слияния (и я предполагаю, что для построения XML 3-way merge from diffs описанная в Официальное исследование Diff3 (PDF) не будет работать). Вы также можете прочитать Сопоставление, различие и слияние XML в блоге (или ссылка на статью).

Другим решением будет unset merge attribute для XML файлов (они будут обрабатываться как конфликты с двоичными файлами и конфликты слияния), а также использовать какой-либо инструмент графического слияния для разрешения конфликтов слияния, возможно, через Git mergetool.

Ответ 2

Если вы знаете, что можете автоматизировать некоторые проблемы слияния, связанные с этими слияниями xml файлов, вы можете script выполнить эти разрешения.
Если есть script, вы можете вызвать их из файла слияния, адаптированного для файлов xml/xhtml, только в некоторых каталогах.

Смотрите здесь для (очень простого) драйвера слияния.

Таким образом, любой конфликт, который остается (поскольку драйвер слияния script не решил его), является законным слиянием проблем, которые необходимо устранить.

Ответ 3

Был элемент, отмеченный в комментариях в другом вопросе, который теперь перенаправляет сюда (Как настроить git merge/git pull для файлов xml?). По логике это тоже должен быть комментарий, но он действительно нуждается в форматировании. Итак, вот как ответ, с этой темой:

Установка merge.conflictStyle в diff3 может быть полезной

Выполнение:

git config --global merge.conflictStyle diff3

(или то же самое без --global если вы хотите его только для одного репозитория, но я предпочитаю сам --global) может сделать копию рабочего дерева более полезной. Обратите внимание, что если вы пишете драйвер слияния, вы не получите копию рабочего дерева в качестве входных данных. Вместо этого вы получаете три файла, ours base и theirs, в качестве трех ваших входных данных. Это в первую очередь полезно, если вы не пытаетесь написать свой собственный драйвер слияния (а написание собственного сложно: если бы это было легко, слияние XML было бы решено довольно давно).

пример

Вот пример входных данных из другой публикации:

$ cat base
<li>
  <span>BA</span>
</li>
$ cat ours
<li>
  <span>BA</span>
</li>
<li>
  <span>CE</span>
</li>
$ cat theirs
<li>
  <span>BA</span>
</li>
<li>
  <span>DF</span>
</li>

Теперь мы можем увидеть, как Git объединит эти файлы, используя git merge-file, который является командной строкой, эквивалентной одной низкоуровневой (на уровне файлов) операции из git merge:

$ cp ours current
$ git merge-file current base theirs
$ cat current
<li>
  <span>BA</span>
</li>
<li>
<<<<<<< curr
  <span>CE</span>
=======
  <span>DF</span>
>>>>>>> theirs
</li>

Здесь, как вы можете видеть, Гит отметил, что изменения в ours (скопированных в current) конфликт с изменениями в theirs по сравнению с base. Однако некоторые части конфликта было легко разрешить, поэтому Git сделал это и отметил только оставшиеся части конфликта.

Когда мы запрашиваем слияние в стиле diff3, мы получаем следующее:

$ cp ours current
$ git merge --diff3 current base theirs
$ cat current
<li>
  <span>BA</span>
</li>
<<<<<<< curr
<li>
  <span>CE</span>
</li>
||||||| base
=======
<li>
  <span>DF</span>
</li>
>>>>>>> theirs

Есть два отличия. Git не только добавляет ||||||| base ||||||| base раздел - который в данном случае пуст; нет никаких строк на входе базы слияния - но он также прекращает делать частичное разрешение изменений ours/current с теми, которые в theirs.

(Это необходимо, так как теперь Git должен показывать "наши против базы" и "их против базы", а не просто "наши против их, после максимальных усилий".)