Подтвердить что ты не робот

Git статус игнорировать окончания строки/идентичные файлы /windows & linux environment/dropbox/mled

Как мне сделать

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 игнорировать разные новые строки.

4b9b3361

Ответ 1

Попробуйте установить значение core.autocrlf следующим образом:

git config --global core.autocrlf true

Ответ 2

Вместо этого используйте .gitattributes, со следующей настройкой:

# Ignore all differences in line endings
*        -crlf

.gitattributes будут найдены в том же каталоге, что и ваш глобальный .gitconfig. Если .gitattributes не существует, добавьте его в этот каталог. После добавления/изменения .gitattributes вам придется сделать жесткий reset репозитория, чтобы успешно применить изменения к существующим файлам.

Ответ 3

Проблема, связанная с командами git в операционной системе Windows:

$ git add --all

предупреждение: LF будет заменен на CRLF в...

Файл будет иметь исходные окончания строк в вашем рабочем каталоге.

Разрешение:

$ git config --global core.autocrlf false     
$ git add --all 

Никаких предупреждающих сообщений не появляется.

Ответ 4

Этот ответ кажется уместным, поскольку ОП ссылается на необходимость решения для нескольких ОС. В этой справочной статье 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 является одним из следующих:

  • текст
  • бинарные (файлы, для которых Git не должен изменять окончания строк)

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"

Ответ 5

Я использую оба окна и 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

Ответ 6

Я создал 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

Обновление

  • fix by evandro777: когда файл имеет место в имени файла или каталоге

Ответ 7

Я использовал это в моем файле .gitattributes. Тогда мне не нужно обновлять репо, использую ли я Mac или Windows.

# Convert to LF line endings on checkout.
* text eol=lf