Предотвратить мерзкие конфликтные маркеры - PullRequest
0 голосов
/ 13 декабря 2018

Я посмотрел довольно тщательно, ты нашел ответ на это и тоже не смог.Есть ли простой способ предотвратить добавление маркерами конфликтов в конфликтующие файлы при слиянии git?Я бы хотел, чтобы git не добавлял «<<<< ==== -----» при конфликте в файле. </p>

Я пытался использовать gitattributes «двоичный», как я думалон не собирался менять содержимое файла, но безуспешно.Есть идеи?

Ура!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Учитывая ваши комментарии, вы должны установить Beyond Compare как mergetool вместо того, чтобы вручную открывать файлы с конфликтами.Сначала убедитесь, что вы можете запустить bc3 в терминале.Затем вы можете настроить его следующим образом (в Linux):

git config --global merge.tool bc3
git config --global mergetool.bc3.trustExitCode true

Теперь, когда вы столкнетесь с конфликтом, просто запустите

git mergetool

, чтобы открыть конфликтующие файлыв Beyond Compare.

Более подробную информацию и инструкции для других операционных систем можно найти на их сайте поддержки: scootersoftware.com / support.php .

0 голосов
/ 13 декабря 2018

Цель состоит в том, чтобы при конфликте файлов

1) иметь возможность пометить файл как "находящийся в конфликте", а

2) иметь возможность использовать Beyond Compare междунеотправленные версии файла («наша» версия и «их» версия).

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

Но, безусловно, есть несколько способов сделать это,Самое простое - начать слияние как обычно

git checkout our_branch
git merge their_branch

, а затем, если оно конфликтует, вернуть рабочее дерево к «нашей» версии

git checkout --ours path/to/conflicted/file

Если Beyond Compare настроен наработать как инструмент сравнения, тогда вы можете пропустить оформление заказа и просто

git diff our_branch their_branch -- path/to/conflicted/file

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

Итак, еще один вариант, более сложный в настройке, но более автоматический в использовании, - это установка собственного драйвера слияния.Пользовательский драйвер слияния включается всякий раз, когда изменяются и «наша» версия, и «их» версия данного файла (относительно «базовой» версии).Это скрипт, который получает в качестве параметров имена временных файлов, представляющих различные версии файла.Он создает (предварительный) результат слияния по пути для «нашей» версии и возвращает состояние, указывающее, возникли ли конфликты.

Драйверы слияния описаны в документации к атрибуту merge (на * 1023).*https://git -scm.com / документы / gitattributes ).Это также показывает, что при наличии настроенного драйвера слияния вы бы связали его с файлом (-ами) по заданному пути (-ям) с файлом .gitattributes.(Вы можете связать его со всеми путями в вашем репо с записью для *, но если ваше репо может содержать двоичные файлы, вы можете либо избежать этого, либо позаботиться о том, чтобы ваш скрипт драйвера вел себя разумно и для двоичных файлов..)

Сам сценарий попытается выполнить обычное объединение

git merge-file -p <ours> <base> <theirs> > <temp-path>

(где <ours>, <base> и <theirs> - из параметров сценариев, а <temp-path>это новый временный файл).Если эта команда возвращает 0 (без конфликтов), сценарий переместит вывод (<temp-path>) поверх «нашей» версии и вернет 0. В противном случае он удалит временный файл, оставит «наш» без изменений и вернет ненулевое значениеvalue.

Теперь это сработало бы так же, как и при первом подходе, за исключением того, что вы можете пропустить git checkout --ours.Это может не стоить того.Но преимущество этого решения в том, что вы можете использовать его, чтобы сделать немного больше.

Проблема со всеми вышеперечисленными решениями состоит в том, что если файл содержит любые конфликты, то ни одиниз изменений (включая не конфликтующие изменения) для этого файла автоматически объединяются.Вы должны обработать весь файл вручную (с помощью Beyond Compare или любого другого).

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

git merge-file --ours <ours> <base> <theirs>

(Вы все равно хотите сначала запустить без опции --ours, чтобы вы знали, возникли ли какие-либо конфликты. Если есть , есть конфликты, то вы удаляете временный файл,перезапустите с опцией --ours - но без -p или перенаправления вывода - и, опять же, верните ненулевое значение, чтобы git знал, что был конфликт.)

Наконец, обратите внимание, что это должно не следует путать с тем, что произойдет, если вы просто запустите слияние либо с -s ours (который полностью игнорирует другое содержимое ветви), либо с -X ours (который разрешает конфликты в пользу "нашей" версии ине сообщает о конфликтах ).

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