Можно ли git merge
игнорировать различия в конце строки?
Может я задаю не тот вопрос ... но:
Я попытался использовать, config.crlf input
но все стало немного грязно и вышло из-под контроля, особенно когда я применил его после свершившегося факта .
Во-первых, применение этой конфигурации после факта, похоже, не влияет на файлы, которые были зафиксированы в хранилище до применения этой опции. Другое дело, что внезапно все коммиты теперь приводят к большому количеству раздражающих предупреждающих сообщений о преобразовании CRLF в LF.
Если честно, мне все равно, какой конец строки используется, я лично предпочитаю стиль Unix \n
, но неважно. Все, что меня волнует, это git merge
чтобы быть немного умнее и игнорировать различия в окончаниях строк.
Иногда у меня есть два идентичных файла, но git помечает их как конфликтующие (и конфликт - это весь файл) просто потому, что они используют другой символ окончания строки.
Обновить:
Я узнал, что git diff
принимает --ignore-space-at-eol
опцию, можно ли будет разрешить git merge
использовать эту опцию, а?
git config merge.renormalize true
Ответы:
Обновление 2013:
Более поздние версии git разрешают использовать слияние со стратегией
recursive
и опция стратегии (-X
):Но использование "
-Xignore-space-change
" также возможноjakub.g также отмечает, что стратегии работают также с сбором вишни :
Это работает намного лучше, чем
ignore-all-space
.Оригинальный ответ (май 2009 г.)
Патч для игнорирования стиля eol был предложен в июне 2007 года , но это касается
git diff --ignore-space-at-eol
не толькоgit merge
.В то время был задан вопрос:
Хулио С Хамано не был в восторге:
Основная идея
git merge
заключается в том, чтобы полагаться на сторонний инструмент слияния.Например, я настроил DiffMerge как инструмент для слияния Git, установив набор правил, которые позволяют этому инструменту слияния игнорировать eol для файлов определенного типа.
Установка в Windows, с MSysGit1.6.3, для сеансов DOS или Git bash, с DiffMerge или KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Git config команды:
git config на системном уровне:
Сценарий DOS (примечание: команда dos2unix происходит отсюда и используется для имитации стиля Unix eol. Эта команда была скопирована в каталог, упомянутый в начале этого ответа.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
В этот момент (нажав «Возврат») откроется DiffMerge или KDiff3, и вы сами увидите, какие строки фактически объединены, а какие игнорируются.
Предупреждение : файл результатов всегда будет в режиме Windows eol (CRLF) с DiffMerge ...
KDiff3 предлагает сохранить так или иначе.
источник
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(это работает намного лучше, чемignore-all-space
)Я искал тот же ответ, и я узнал это
Таким образом, выполнение этой команды в любом хранилище сделает свое дело:
источник
После прочтения https://stackoverflow.com/a/12194759/1441706 и https://stackoverflow.com/a/14195253/1441706
для меня эта команда отлично справилась:
источник
Как и в этом ответе: https://stackoverflow.com/a/5262473/943928
Вы можете попробовать:
git merge -s recursive -Xignore-space-at-eol
источник
Что я сделал, так это оставил все по умолчанию (то есть autocrlf = true), коснулся всех файлов (найдите. -Exec touch {} \;), позволил git увидеть их как «измененные» и зафиксировать их обратно, и с этим покончено. В противном случае вы всегда будете страдать от раздражающих сообщений или неожиданных различий, или вам придется отключить все пробелы в git.
Вы потеряете информацию о вине, но лучше сделать это раньше, чем позже :)
источник
"git merge -Xrenormalize" работает как шарм.
источник
Не похоже, что это можно сделать напрямую, но этот пост предлагает обходной путь.
http://osdir.com/ml/git/2009-02/msg02532.html
источник
http://stahlforce.com/dev/index.php?tool=remcrlf
Я попробовал это сделать, но если после последней строки в вашем коде у вас еще не было CRLF, он добавляет сам LF, и файл выглядит измененным в git. Помимо этого это работает.
источник
Теперь мне кажется, что лучший способ - нормализовать окончания строк в обеих ветвях (и зафиксировать) перед их объединением.
Я гуглил "преобразовать crlf в lf" и нашел это как первые результаты:
http://stahlforce.com/dev/index.php?tool=remcrlf
Я скачал его и использовал, похоже, хороший инструмент.
Обязательно укажите каталог и тип файла (например, .py), иначе он может попытаться возиться с содержимым
.git
каталога!источник
AFAICT, (я не пробовал), вы можете использовать,
git diff
чтобы сравнить ветку, которую вы хотите объединить с общим предком, а затем применить результатыgit apply
. Обе команды имеют--ignore-whitespace
опции, чтобы игнорировать конец строки и ошибки пробела.К сожалению, если патч не применяется корректно, вся операция прерывается. Вы не можете исправить конфликты слияния. Существует
--reject
возможность оставить в.rej
файлах непатчимые фрагменты , что помогает, но не то же самое, что конфликты слияния, отображаемые в одном файле.источник
После прочтения Решить конфликты слияния: принудительно перезаписать все файлы
Я наконец решил свою версию этой проблемы. Я пытался получить обновления из вышестоящего репозитория, но у моего текущего были проблемы, связанные с CRLF, и я не смог объединиться в результате. Следует отметить, что у меня не было никаких локальных изменений, о которых мне нужно было беспокоиться. Следующие шаги решили мою проблему:
В соответствии с инструкциями github по синхронизации вилок ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Мое ограниченное понимание git говорит мне, что я делаю то, что хочу - перебираю свой форк (без фактических незафиксированных изменений), чтобы получить все изменения, сделанные в исходном коде. Согласно исходной странице, этот шаг обычно не требуется, но проблема CRLF сделала его обязательным.
git merge upstream/master
git push
источник
git reset --hard upstream/master
выбрасываете свой местный филиал и указывает на этоupstream/master
, делаяgit merge upstream/master
неоперативный?Тем не менее, я предлагаю использовать такой инструмент, как sed, чтобы получить правильные окончания строк, а затем файлы сравнения. Я потратил пару часов на сравнивают проекты с различными окончаниями линии.
Лучший способ был:
.git
каталог) в другой каталог, создайте в нем репозиторий, затем добавьте файлы и зафиксируйте их (должен быть в основной ветке в новом репозитории).dev
(git checkout -b dev
), зафиксируйте файлы в этой ветке и запустите (если первый проект находится в master):git diff master..dev --names-only
увидеть только имена измененных файловисточник