2013-12-10 28 views
23

Jak zrobićstan Git ignorować zakończeń linii/identyczne pliki/windows i linux environment/Dropbox/mled

git status

zignorować linię kończącą różnice?

Informacje ogólne:

używam losowo Windows i Linux do pracy nad projektem. Projekt znajduje się w Dropbox.

Znalazłem dużo o tym, jak zrobić git diff ignorować zakończenia linii. Ponieważ używam meld git diff otwiera meldunek dla każdego pliku. A meld mówi "identyczny plik".

Jak mogę tego uniknąć. Git powinien otwierać tylko meldowania dla zmienionych plików. Status git nie powinien zgłaszać plików jako zmienionych, jeśli tylko zakończenie pliku jest inne.

EDIT: Przyczyna:

Stało się to z powodu tego ustawienia w systemie Windows

core.autocrlf true

Więc wyrejestrowany kopię roboczą w systemie Linux i ustawić core.autocrlf false w systemach Windows.

Byłoby miło wiedzieć, jak sprawić, by status git ignorował różne nowe linie.

+2

Jeśli dzielenie się plik za pomocą dropboxa na różnych platformach, do których to się zdarzy, chyba że wyraźnie to zrobisz ll git traktuje wszystkie pliki jako binarne. Prawidłowym rozwiązaniem jest ** nie używać Dropbox ** dla repozytoriów git. – Petesh

+0

Pamiętaj: http://stackoverflow.com/questions/2825428/why-should-i-use-core-autocrlf-true-in-git - this może trochę pomóc – Petesh

+0

Dowiedziałem się, jak to działa dobrze z Dropbox: ustawiając core.autocrlf false –

Odpowiedz

22

Spróbuj ustawić wartość core.autocrlf tak:

git config --global core.autocrlf true 
+10

nie jest to podstawowa przyczyna problemu –

+1

@ThorstenNiehues Używam tego ustawienia w niektórych projektach roboczych. W pracy muszę używać okien, do domu używam mac i linux. Wcześniej miałem ten sam problem co ty, po tym ustawieniu wszystko było w porządku. –

+0

To dziwne, ponieważ kasowanie okien ma \ r \ n zakończenia linii tylko na Linuksie \ n Czy masz kopie robocze w Dropbox (lub podobne)? –

23

Stosować .gitattributes zamiast, z następującym ustawieniu:

# Ignore all differences in line endings 
*  -crlf 

.gitattributes będzie można znaleźć w tym samym katalogu co Twój globalny. gitconfig. Jeśli .gitattributes nie istnieje, dodaj go do tego katalogu. Po dodaniu/zmianie .gitattributes będziesz musiał wykonać twardy reset repozytorium, aby pomyślnie zastosować zmiany do istniejących plików.

+0

To działało dla mnie w jednym strumieniu, ale gdy próbowałem utworzyć go w innym strumieniu dla tego samego projektu, nadal pokazuje różnice Newline. – pfernandom

+1

@pfernandom, czy prawdopodobnie masz wiele .gitattributes w swoim projekcie? Najpierw będzie wyglądać najbardziej "lokalna" wersja, więc jeśli posiadasz je w lokalnym katalogu, w którym znajdują się pliki, użyje tego w stosunku do całego twojego projektu. – Trashman

+0

Czy musi mieć 8 spacji przed -crlf? – Igonato

3

Używam zarówno systemu Windows, jak i systemu Linux, ale rozwiązanie core.autocrlf true mi nie pomogło. Nawet nie zmieniłem nic po git checkout <filename>.

więc używam obejścia zastąpił 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 

Właśnie porównać md5sum pliku i jego brata w repozytorium.

Przykâadowa:

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

być może możesz użyć "git diff -b" dla każdego pliku, aby sprawdzić zmiany excel whitespace zmiany – Ivan

2

stworzyłem skrypt do ignorowania różnic w zakończeń linii:

To spowoduje wyświetlenie plików, które nie są dodawane do listy popełnienia i zostały zmodyfikowane (po ignorując różnice w zakończenia linii). Możesz dodać argument "dodaj", aby dodać te pliki do zatwierdzenia.Kod

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

Źródło: https://github.com/lepe/scripts/blob/master/gitdiff.pl

Aktualizacje:

  • fix przez evandro777: Gdy plik ma miejsca w pliku lub katalogu
+0

Dzięki! To jedyny sposób, w jaki mogę uzyskać prawdziwą różnicę. Jest tylko problem, że się z 3 linii drukowanych, pokazując ten błąd: sh: 1: Błąd składni: cytowany niezakończony ciąg – evandro777

+1

Poprawka dotycząca problemu Scenariusz: Problem: Gdy plik ma miejsca w pliku ou directory, git użyje "", więc skrypt się zepsuje. Rozwiązaniem jest zmiana tej linii: my @mods = 'status git --porcelain 2>/dev/null | grep '^ M' | awk '{print \ $ 2}' '; do tego: my @mods = 'status git --porcelain 2>/dev/null | grep '^ M' | cut -c4-'; – evandro777

+0

@ evandro777: Dzięki! Zaktualizowałem zarówno odpowiedź, jak i kod git. – lepe