Git durumu satır sonlarını / aynı dosyaları / windows ve linux ortamını / dropbox / mled'i yok sayar


113

Nasıl yaparım

git durumu

satır sonundaki farkları göz ardı etmek mi?

Arkaplan bilgisi:

Proje üzerinde çalışmak için rastgele Windows ve Linux kullanıyorum. Proje Dropbox'ta.

Git diff'in satır sonlarını nasıl yok sayacağına dair çok şey buldum. Meld kullandığım için git diff her dosya için meld açar. Ve meld "aynı dosya" diyor.

Peki bundan nasıl kaçınabilirim? Git sadece değiştirilen dosyalar için meld açmalıdır. Ve git durumu, yalnızca dosya sonu farklıysa dosyaları değiştirilmiş olarak bildirmemelidir.

DÜZENLEME: Neden:

Bu, Windows'taki bu ayar nedeniyle oldu

core.autocrlf true

Bu yüzden Linux'ta çalışan kopyayı kontrol ettim ve Windows'ta core.autocrlf false ayarladım.

Git statüsünün farklı yeni satırları nasıl göz ardı edeceğini bilmek yine de güzel olurdu.


3
Dropbox kullanarak dosyayı farklı platformlarda paylaşıyorsanız, git'e tüm dosyaları ikili olarak işlemesini açıkça söylemediğiniz sürece bu gerçekleşecektir. Doğru çözüm, git depoları için dropbox kullanmamaktır
Petesh

dikkat edin: stackoverflow.com/questions/2825428/… - bu biraz yardımcı olabilir
Petesh

Dropbox ile nasıl çalıştığını öğrendim: core.autocrlf'yi false olarak ayarlayarak
Thorsten Niehues

3
AFAIK'in git'e dosyaları ikili olarak ele almasını söylemesinin, dosyayı farklılaştırma biçimini değiştirme gibi bir yan etkisi de vardır. Doğru çözüm git'e satır sonlarını yok saymasını söylemektir. En az sevdiğim şeylerden 2'si: satır biten problemlerle uğraşmak ve insanların depolarını nasıl kurduklarına dair gereksiz keskin FUD :)
ChrisM

Vay canına, biraz zaman aldı, bu sorunun core.autocrlfWindows'taki temel nedeni, aynı zamanda Linux'ta da bir çare. Sorun şu ki, autocrlfWindows'ta geneldir ve depoda bu ayar yoktur .git/config. Bir yerel çalıştırarak git config core.autocrlf true, Windows'ta klonlanmış ancak Linux'ta erişilen NTFS çalışma kopyamdaki sahte değişikliklerden kurtuldum. (artık sembolik bağlarda sadece sahte değişiklikler var - NTFS sembolik bağları fuseblk bağlarında ÇALIŞIYOR, ancak Git bunları değiştirilmiş olarak görüyor ...)
Tomasz Gandor

Yanıtlar:


105

Core.autocrlf değerini şu şekilde ayarlamayı deneyin:

git config --global core.autocrlf true

7
@ThorstenNiehues Bu ayarı bazı iş projelerinde kullanıyorum. İş yerinde Windows, evde mac ve linux kullanmalıyım. Bundan önce seninle aynı sorunu yaşadım, bu ayarlamadan sonra her şey yolundaydı.
Saša Šijak

1
Bu garip çünkü Windows üzerindeki bir ödeme sadece Linux'ta \ r \ n satır sonlarına sahip \ n Dropbox'ta her iki çalışma kopyası (veya benzeri) var mı?
Thorsten Niehues

1
@ThorstenNiehues Hayır, git deposu github'da. Hmm, belki de dropbox, dosyaları senkronize ederken bir şekilde satır sonlarıyla dalga geçiyordur? Git için dropbox kullanmak tuhaf görünüyor. Bitbucket kullanmayı deneyin (ücretsiz özel depolara sahiptir), sadece küçük bir depo yapın ve 2 makinenizde bazı küçük metin dosyalarıyla test edin.
Saša Šijak

1
1. Çalışma kopyası ve yerel depo Dropbox'ta (herkese açık bir depoya ihtiyacım yok) muhtemelen fark bu
Thorsten Niehues

3
Windows'ta: core.autocrlf trueCygWin'de çalışan bir ayardır. core.safecrlf falsegit bash veya
mingw'de

43

Bunun yerine aşağıdaki ayarla .git özniteliklerini kullanın:

# Ignore all differences in line endings
*        -crlf

.git öznitelikleri, genel .gitconfig ile aynı dizinde bulunur. .Gitattributes yoksa, o dizine ekleyin. .Git özniteliklerini ekledikten / değiştirdikten sonra, değişiklikleri mevcut dosyalara başarılı bir şekilde uygulamak için depoda donanımdan sıfırlama yapmanız gerekecektir.


Benim için bir akışta işe yaradı, ancak aynı proje için başka bir akışta oluşturmaya çalıştığımda, yine de Newline farklılıklarını gösteriyor.
pfernandom

1
@pfernandom, projenizde birden çok .git özniteliği olması olası mı? İlk önce en "yerel" sürüme bakacaktır, bu nedenle dosyaların bulunduğu yerel dizinde bir tane varsa, bunu proje genelinde kullanacaktır.
Trashman

-Crlf'den önce 8 boşluk olması gerekir mi?
Igonato

Farketmez
Trashman

Bu, satır sonlarını görmezden gelmekten daha fazlasını yapar git status. Aslında dosyaların arşive nasıl konulacağını değiştirir. ref: git-scm.com/docs/gitattributes#_code_text_code
Vince

31

OP, çoklu işletim sistemi çözümüne yönelik bir ihtiyaca atıfta bulunduğundan, bu cevap alakalı görünmektedir. Bu Github yardım makalesi, işletim sistemleri arası satır sonlarını ele almak için mevcut yaklaşımları ayrıntılarıyla anlatmaktadır . İşletim sistemleri arası satır sonlarını yönetmek için global ve repo başına yaklaşımlar vardır.

Küresel yaklaşım

Linux veya OS X'te Git satır sonları işlemeyi yapılandırın:

git config --global core.autocrlf input

Windows'ta Git satır sonları işlemeyi yapılandırın:

git config --global core.autocrlf true

Repo başına yaklaşım:

Deponuzun kökünde, bir .gitattributesdosya oluşturun ve proje dosyalarınız için satır sonlandırma ayarlarını, aşağıdaki formatta birer birer birer birer tanımlayın: path_regex line-ending-settingsburada line-ending-settingsaşağıdakilerden biri:

  • Metin
  • ikili (Git'in satır sonlarını değiştirmemesi gereken dosyalar - çünkü bu, PNG'ler gibi bazı görüntü türlerinin tarayıcıda oluşturulmamasına neden olabilir)

textDeğer eşleme dosyaları için satır sonları nasıl ele alınacağı üzerinde Git talimat daha da yapılandırılabilir:

  • text - Satır sonlarını işletim sistemi yerel satır sonlarına değiştirir.
  • text eol=crlf- CRLFÖdeme sırasında satır sonlarını dönüştürür .
  • text eol=lf- LFÖdeme sırasında satır sonlarını dönüştürür .
  • text=auto - Satır kontrolünü Git'in takdirine bırakan mantıklı varsayılan.

Örnek bir .gitattributes dosyasının içeriği:

# 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

Satır sonu ayarlarını değiştirdikten sonra deponuzu nasıl yenileyeceğiniz hakkında daha fazla bilgiyi burada bulabilirsiniz . Tldr:

dosyalarınızı Git ile yedekleyin, deponuzdaki her dosyayı silin (.git dizini hariç) ve ardından dosyaları tek seferde geri yükleyin. Mevcut dosyalarınızı Git'e kaydedin, böylece çalışmalarınızın hiçbiri kaybolmaz.

git add . -u

git commit -m "Saving files before refreshing line endings"

Dizini kaldırın ve Git'i çalışma dizinini yeniden taramaya zorlayın.

rm .git/index

Tüm yeni satır sonlarını almak için Git dizinini yeniden yazın.

git reset

Yeniden yazılmış, normalleştirilmiş dosyaları gösterin.

Bazı durumlarda, yapılması gereken budur. Diğerlerinin aşağıdaki ek adımları tamamlaması gerekebilir:

git status

Değiştirilen tüm dosyalarınızı geri ekleyin ve onları bir işleme için hazırlayın. Bu, varsa, hangi dosyaların değişmediğini inceleme şansınızdır.

git add -u

Burada [s] yazan birçok mesajı görmek tamamen güvenlidir "uyarı: dosyada CRLF LF ile değiştirilecektir."

.Gitattributes dosyasını yeniden yazın.

git add .gitattributes

Değişiklikleri deponuza işleyin.

git commit -m "Normalize all the line endings"


18

Sayı , Windows işletim sistemi üzerinde git komutlara ilişkin:

$ git add --all

uyarı: LF, içinde CRLF ile değiştirilecektir ...

Dosya, çalışma dizininizde orijinal satır sonlarına sahip olacaktır.

Çözünürlük :

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

Herhangi bir uyarı mesajı gelmez.


bunu kullandığınız tüm işletim sistemlerinde yapmalısınız, yani: Windows'ta ve linux'ta. Her işletim sisteminin kendi global .git / config dosyası olduğunu hatırlayın, bu nedenle bu ayarları benzer yapmanız gerekir. İşte bu yüzden @Thorsten sorun yaşıyordunuz. Ama bayrağı false yerine true olarak ayarladım.
Emmanuel Mahuni

Bu çözüm Linux'ta da işe yarıyor (@ SašaŠijak cevabı benim için işe yaramadı)
juliocesar

4

Satır sonlarındaki farklılıkları yok saymak için bir komut dosyası oluşturdum:

Kaydetme listesine eklenmemiş ve değiştirilmiş dosyaları gösterecektir (satır sonlarındaki farklılıkları göz ardı ettikten sonra). Bu dosyaları yürütmenize eklemek için "ekle" bağımsız değişkenini ekleyebilirsiniz.

#!/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`;
        }
    }
}

Kaynak kodu: https://github.com/lepe/scripts/blob/master/gitdiff.pl

Güncellemeler :

  • evandro777 düzeltmesi: Dosyanın dosya adı veya dizinde yer olduğunda

Teşekkürler! Gerçek farkı anlamamın tek yolu bu. Yalnızca 3 satır yazdırıldığında meydana gelen ve bu hatayı gösteren bir sorun var: sh: 1: Sözdizimi hatası: Sonlandırılmamış alıntı dizesi
evandro777

1
Komut dosyası sorunu için bir düzeltme: Sorun: Dosya dosya adı ou dizininde yer olduğunda, git "" kullanır, bu nedenle komut dosyası bozulur. Düzeltme şu satırı değiştirmektir: my @mods = git status --porcelain 2>/dev/null | grep '^ M ' | awk '{ print \$2 }'; buna: my @mods = git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-;
evandro777

@ evandro777: Teşekkürler! Hem yanıtı hem de git kodunu güncelledim.
lepe

3

Hem Windows hem de linux kullanıyorum, ancak çözüm core.autocrlf truebana yardımcı olmadı. Hatta daha sonra hiçbir şey değişmedi git checkout <filename>.

Bu yüzden bunun yerine geçici çözüm kullanıyorum 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

Ben sadece md5sumbir dosya ile depodaki kardeşini karşılaştırıyorum .

Örnek çıktı:

$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL

2
beyaz boşluk değişikliklerini excel olarak kontrol etmek için her dosya için "git diff -b" kullanabilirsiniz
Ivan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.