git-diff игнорировать ^M
в проекте, где некоторые файлы содержат ^M в качестве разделителей новой строки. Разделение этих файлов, по-видимому, невозможно, так как git-diff видит его как весь файл-это всего лишь одна строка.
как один diff с предыдущей версией?
есть ли такая опция, как" лечить ^M как новую строку при дифференцировании"?
prompt> git-diff "HEAD^" -- MyFile.as
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
No newline at end of file
prompt>
обновление:
теперь я написал скрипт, который проверяет последние 10 ревизий и преобразует CR в ПЕРЕВОД СТРОКИ.
require 'fileutils'
if ARGV.size != 3
puts "a git-path must be provided"
puts "a filename must be provided"
puts "a result-dir must be provided"
puts "example:"
puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
exit(1)
end
gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]
unless FileTest.exist?(".git")
puts "this command must be run in the same dir as where .git resides"
exit(1)
end
if FileTest.exist?(resultdir)
puts "the result dir must not exist"
exit(1)
end
FileUtils.mkdir(resultdir)
10.times do |i|
revision = "^" * i
cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr 'r' 'n' > #{resultdir}/#{filename}_rev#{i}"
puts cmd
system cmd
end
9 ответов:
GitHub предлагает что вы должны убедиться, что используете только \n в качестве символа новой строки в репозиториях с обработкой git. Есть возможность автоматического преобразования:
$ git config --global core.autocrlf trueконечно, это говорит о преобразовании crlf в lf, в то время как вы хотите конвертировать cr в lf. Я надеюсь, что это все еще работает...
а затем конвертировать файлы:
# Remove everything from the index $ git rm --cached -r . # Re-add all the deleted files to the index # You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>." $ git diff --cached --name-only -z | xargs -0 git add # Commit $ git commit -m "Fix CRLF"ядра.autocrlf описывается на на странице.
разработки на Windows, я столкнулся с этой проблемой при использовании
git tfs. Я решил это так:git config --global core.whitespace cr-at-eolэто в основном говорит Git, что конец строки CR не является ошибкой. В результате те раздражают
^Mсимволы больше не появляются в конце строк вgit diff,git showи т. д.кажется, что он оставляет другие настройки как есть; например, дополнительные пробелы в конце строки все еще отображаются как ошибки (выделенные красным цветом) в diff.
(другие ответы ссылались на это, но выше именно так, как установить настройку. Чтобы задать параметр только для одного проекта, опустите
--global.)EDIT:
после многих страданий, связанных с окончанием строки, Мне повезло, когда я работал в команде .NET, с этими настройками:
- нет ядра.настройка eol
- нет ядра.установка пробелов
- нет ядра.установка autocrlf
- при запуске установщика Git для Windows, вы получите эти три варианта:
- проверка Windows-стиль, фиксация Unix-стиль окончания строки
- проверка как есть, фиксация окончаний строк в стиле Unix
- проверка как есть, фиксация как есть
Если вам нужно использовать параметр пробела, вы, вероятно, должны включить его только на основе каждого проекта, если вам нужно взаимодействовать с TFS. Просто опустите
--global:git config core.whitespace cr-at-eolЕсли вам нужно удалить некоторые ядра.* настройки, самый простой способ-запустить эту команду:
git config --global -eэто открывает ваш глобальный .gitconfig файл в текстовом редакторе, и вы можете легко удалить строки, которые вы хотите удалить. (Или вы можете поставить ' # ' перед ними, чтобы прокомментировать их.)
попробовать
git diff --ignore-space-at-eolилиgit diff --ignore-space-changeилиgit diff --ignore-all-space.
Смотрите также:
core.whitespace = cr-at-eolили
[core] whitespace = cr-at-eolздесь
whitespaceначинается с tab символ.
почему вы получаете эти
^Mв своемgit diff?в моем случае я работал над проектом, который был разработан в Windows, и я использовал OS X. Когда я изменил какой-то код, я увидел
^Mв конце строк я добавил вgit diff. Я думаю, что^Mпоявлялись, потому что они были разными окончаниями строк, чем остальная часть файла. Потому что остальная часть файла была разработана в Windows используетсяCRокончания строк, и в OS X он используетLFлиния окончания.по-видимому, разработчик Windows не использовал опцию"проверка в стиле Windows, фиксация окончаний строк в стиле Unix " во время установки Git.
так что же нам с этим делать?
вы можете заставить пользователей Windows переустановить git и использовать "проверка в стиле Windows, фиксация окончаний строк в стиле Unix опции". Это то, что я бы предпочел, потому что я вижу окна как исключение в его конце строки персонажи и Windows исправляет свою собственную проблему таким образом.
если вы идете на эту опцию, вы должны, однако, исправить текущие файлы (потому что они все еще используют
CRконцы строк). Я сделал это, выполнив следующие действия:
удалите все файлы из репозитория, но не из вашей файловой системы.
git rm --cached -r .добавить
.gitattributesфайл, который принуждает определенные файлы использоватьLFкак окончание строки. Положите это в файл:*.ext text eol=crlfзаменить
.extс расширениями файлов, которые вы хотите сопоставить.добавить все файлы.
git add .это покажет сообщения, как это:
warning: CRLF will be replaced by LF in <filename>. The file will have its original line endings in your working directory.убрать
.gitattributesфайл, если у вас нет упрямых пользователей Windows, которые не хотят использовать "проверка в стиле Windows, фиксация окончаний строк в стиле Unix опции".совершить и подтолкнуть все это.
удалить и проверить соответствующие файлы на всех системах, где они используются. На системах Windows, убедитесь, что они теперь используют "проверка в стиле Windows, фиксация окончаний строк в стиле Unix опции". Вы также должны сделать это в системе, где вы выполнили эти задачи, потому что при добавлении файлов git сказал:
The file will have its original line endings in your working directory.вы можете сделать что-то подобное, чтобы удалить файлы:
git ls | grep ".ext$" | xargs rm -fи затем это, чтобы получить их обратно с правильными окончаниями строки:
git ls | grep ".ext$" | xargs git checkoutконечно, заменить
.extС расширением требуется.теперь ваш проект использует только
LFсимволы окончания строки, и противныйCRперсонажи никогда не вернутся :).другой вариант заключается в применении окончаний строк стиля windows. Вы также можете использовать для этого.
больше информация: https://help.github.com/articles/dealing-with-line-endings/#platform-all
есть ли такая опция, как" лечить ^M как новую строку при различии"?
там будет один с Git 2.16 (Q1 2018), как "
diff" семейство команд научилось игнорировать различия в возврате каретки в конце строки.посмотреть commit e9282f0 (26 окт 2017) by Junio C Hamano (
gitster).
Помог-by:Йоханнес Schindelin (dscho).
(слитый Junio C Hamano --gitster-- на commit 10f65c2, 27 ноября 2017)diff:
--ignore-cr-at-eolновый параметр
--ignore-cr-at-eolсообщает diff machinery для обработки возврата каретки в конце (полной) строки, как будто ее не существует.так же, как и другие "
--ignore-*" опции для игнорирования различных видов пробелов различия, это поможет рассмотреть реальные изменения, которые вы сделали, не отвлекаясь на поддельныеCRLF<->LFпреобразование, выполненное вашей редакторской программой.
TL; DR
изменить
core.pagerдо"tr -d '\r' | less -REX", а не исходный кодвот почему
эти надоедливые ^M показаны артефакт раскрашивания и пейджера.
Это вызвано
less -R, опция git пейджера по умолчанию. (git по умолчанию пейджерless -REX)первое, что нужно отметить, что
git diff -bне будет показывать изменения в белом пространстве (например, \r \ n vs \n)настройка:
git clone https://github.com/CipherShed/CipherShed cd CipherShedбыстрый тест для создания файла unix и изменения окончаний строк не покажет никаких изменений с
git diff -b:echo -e 'The quick brown fox\njumped over the lazy\ndogs.' > test.txt git add test.txt unix2dos.exe test.txt git diff -b test.txtмы отмечаем, что принуждение трубы к меньшему не показывает ^M, но позволяет цвет и
less -Rтут:git diff origin/v0.7.4.0 origin/v0.7.4.1 | less git -c color.ui=always diff origin/v0.7.4.0 origin/v0.7.4.1 | less -Rисправление показано с помощью трубы для удаления \r (^M) с выхода:
git diff origin/v0.7.4.0 origin/v0.7.4.1 git -c core.pager="tr -d '\r' | less -REX" diff origin/v0.7.4.0 origin/v0.7.4.1неразумная альтернатива-использовать
less -r, потому что это пройдет через все управляющие коды, а не только цветовые коды.если вы хотите просто отредактировать файл конфигурации git напрямую, это запись для обновления / добавления:
[core] pager = tr -d '\r' | less -REX
Я долго боролся с этой проблемой. Безусловно, самое простое решение-не беспокоиться о символах ^M и просто использовать визуальный инструмент diff, который может их обрабатывать.
вместо ввода:
git diff <commitHash> <filename>попробуй:
git difftool <commitHash> <filename>
Если вы используете Eclipse, вы можете сделать
^Mисчезают изgit diffустановкаFile > Convert Line Delimiter To > Unix (LF, \n, 0A, ¶)

Comments