Ответ 1
Попробуйте установить значение core.autocrlf следующим образом:
git config --global core.autocrlf true
Как мне сделать
git статус
игнорировать разницу в конце строки?
Фоновая информация:
Я использую случайно Windows и Linux для работы над проектом. Проект находится в Dropbox.
Я много узнал о том, как сделать окончание строк git diff ignore. Поскольку я использую meld git diff, открывается meld для каждого файла. И meld говорит "идентичный файл".
Итак, как мне избежать этого. git должен только открывать meld для измененных файлов. И статус git не должен сообщать файлы как измененные, если только окончание файла отличается.
РЕДАКТИРОВАТЬ: Причина:
Это произошло из-за этого параметра в Windows
core.autocrlf true
Итак, я проверил рабочую копию в Linux и установил core.autocrlf false в Windows.
Было бы неплохо узнать, как сделать статус git игнорировать разные новые строки.
Попробуйте установить значение core.autocrlf следующим образом:
git config --global core.autocrlf true
Вместо этого используйте .gitattributes, со следующей настройкой:
# Ignore all differences in line endings
* -crlf
.gitattributes будут найдены в том же каталоге, что и ваш глобальный .gitconfig. Если .gitattributes не существует, добавьте его в этот каталог. После добавления/изменения .gitattributes вам придется сделать жесткий reset репозитория, чтобы успешно применить изменения к существующим файлам.
Проблема, связанная с командами git в операционной системе Windows:
$ git add --all
предупреждение: LF будет заменен на CRLF в...
Файл будет иметь исходные окончания строк в вашем рабочем каталоге.
Разрешение:
$ git config --global core.autocrlf false
$ git add --all
Никаких предупреждающих сообщений не появляется.
Этот ответ кажется уместным, поскольку ОП ссылается на необходимость решения для нескольких ОС. В этой справочной статье Github подробно описаны доступные подходы для обработки окончаний строк в разных ОС. Существуют глобальные и репо-подходы к управлению окончаниями перекрестных линий.
Глобальный подход
Сконфигурируйте обработку концов строк Git в Linux или OS X:
git config --global core.autocrlf input
Сконфигурируйте обработку концов строк Git в Windows:
git config --global core.autocrlf true
Подход репо:
В корне .gitattributes
файл .gitattributes
и определите параметры окончания строки для файлов проекта, по одной строке за раз в следующем формате: path_regex line-ending-settings
где line-ending-settings
path_regex line-ending-settings
line-ending-settings
является одним из следующих:
text
значение может быть дополнительно сконфигурировано для указания Git, как обрабатывать окончания строк для соответствующих файлов:
text
- меняет окончания строк на собственные окончания ОС.text eol=crlf
- Конвертирует окончания строк в CRLF
при оформлении text eol=crlf
.text eol=lf
- Конвертирует окончания строк в LF
при оформлении заказа.text=auto
- разумное значение по умолчанию, при котором дескриптор строки остается на усмотрение Git.Вот содержимое примера файла .gitattributes:
# Set the default behavior for all files.
* text=auto
# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text
# Convert to CRLF line endings on checkout.
*.sln text eol=crlf
# Convert to LF line endings on checkout.
*.sh text eol=lf
# Binary files.
*.png binary
*.jpg binary
Подробнее о том, как обновить репо после изменения настроек окончания строки, читайте здесь. TL;DR:
сделайте резервную копию ваших файлов с помощью Git, удалите все файлы в вашем хранилище (кроме каталога .git), а затем восстановите файлы сразу. Сохраните ваши текущие файлы в Git, чтобы ни одна из ваших работ не была потеряна.
git add. -u
git commit -m "Saving files before refreshing line endings"
Удалите индекс и заставьте Git выполнить повторное сканирование рабочего каталога.
rm.git/index
Перепишите индекс Git, чтобы подобрать все новые окончания строки.
git reset
Покажите переписанные, нормализованные файлы.
В некоторых случаях это все, что нужно сделать. Другим может потребоваться выполнить следующие дополнительные шаги:
git status
Добавьте все ваши измененные файлы обратно и подготовьте их к фиксации. Это ваш шанс проверить, какие файлы, если они есть, остались без изменений.
git add -u
Совершенно безопасно видеть здесь много сообщений, которые читают [s] "предупреждение: CRLF будет заменен на LF в файле".
Перепишите файл .gitattributes.
git add.gitattributes
Зафиксируйте изменения в вашем хранилище.
git commit -m "Normalize all the line endings"
Я использую оба окна и linux, но решение core.autocrlf true
мне не помогло. Я даже ничего не изменил после git checkout <filename>
.
Поэтому я использую обходное решение для замены git status
- gitstatus.sh
#!/bin/bash
git status | grep modified | cut -d' ' -f 4 | while read x; do
x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
x2="$(cat $x | md5sum | cut -d' ' -f 1 )"
if [ "$x1" != "$x2" ]; then
echo "$x NOT IDENTICAL"
fi
done
Я просто сравниваю md5sum
файла и его брата в репозитории.
Пример вывода:
$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL
Я создал script, чтобы игнорировать различия в концах строк:
Он отобразит файлы, которые не добавлены в список фиксаций, и были изменены (после игнорирования различий в концах строк). Вы можете добавить аргумент "добавить", чтобы добавить эти файлы в свою фиксацию.
#!/usr/bin/perl
# Usage: ./gitdiff.pl [add]
# add : add modified files to git
use warnings;
use strict;
my ($auto_add) = @ARGV;
if(!defined $auto_add) {
$auto_add = "";
}
my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
my $diff = `git diff -b $mod 2>/dev/null`;
if($diff) {
print $mod."\n";
if($auto_add eq "add") {
`git add $mod 2>/dev/null`;
}
}
}
Исходный код: https://github.com/lepe/scripts/blob/master/gitdiff.pl
Обновление
Я использовал это в моем файле .gitattributes. Тогда мне не нужно обновлять репо, использую ли я Mac или Windows.
# Convert to LF line endings on checkout.
* text eol=lf