Пользовательский git diff, чтобы игнорировать некоторые конфликты - PullRequest
4 голосов
/ 27 мая 2009

Я начинаю тесты, чтобы перейти от cvs к git, и у меня проблема со всеми моими тестами.

Мы поддерживаем пользовательскую копию исходников FreeBSD, поэтому при выпуске новой версии FreeBSD в cvs мы делаем следующее:

  1. Импорт нового источника FreeBSD в качестве ветки поставщика
  2. Объединить изменения в HEAD

Я пытался сделать то же самое с git, и это сработало, но почти все файлы FreeBSD имеют собственный идентификатор, подобный следующему:

$FreeBSD: release/7.0.0/COPYRIGHT 175036 2008-01-01 09:36:30Z imp $

Эти строки всегда меняются, и из-за места, в котором они хранятся в репозитории svn (выпуск / 7.0.0, 7.1.0, 7.2.0), git генерирует множество конфликтов, которые необходимо было исправить вручную.

Я хотел бы знать, есть ли способ настроить git так, чтобы он просто игнорировал diff-файлы в этих строках и использовал новый, не спрашивая.

Я могу сделать это с помощью команды diff, игнорируя эти строки, например:

diff -q -I'[$]FreeBSD:.*$'

Заранее спасибо.

1 Ответ

1 голос
/ 27 мая 2009

Я не уверен, что вы можете избежать конфликта во время слияний из-за этих изменений.

Что вы можете сделать, так это небольшой скрипт, способный перечислить все файлы для слияния, выполнить diff -q -I'[$]FreeBSD:.*$' для каждого из них, а для тех, у кого нет различий, выполнить

git checkout --theirs theFreeBSDFile

тогда возобновление слияния сможет завершить конфликтующее слияние.

git checkout --theirs 'проверяет стадию № 3 (их) на наличие необработанных путей.

На самом деле, git mergetool был бы идеален для работы: непосредственно перед слиянием, включающим файлы FreeBSD, настройте утилиту mergetool на этот скрипт, как описано в вопросе Возможно ли это для git-merge, чтобы игнорировать различия в конце строки? .
Если вы сконфигурируете конфигурацию mergetool для доверия к коду завершения этого скрипта, любой файл, который не отображает никаких отличий, кроме пользовательских строк FreeBSD, будет иметь значение «git checkout --theirs» и, как сообщается, «слит», другой не будет объединен тем же скриптом .
В конце, если резюме все еще показывает конфликтующий файл, сбросьте инструмент слияния на ваш любимый difftool и разрешите оставшиеся конфликтующие файлы.

...