W projekcie, w którym niektóre pliki zawierają ^ M jako separatory nowego wiersza. Zróżnicowanie tych plików jest pozornie niemożliwe, ponieważ git-diff widzi je, ponieważ cały plik jest tylko jedną linią.
Jak się różni od poprzedniej wersji?
Czy istnieje opcja typu „traktuj ^ M jak nowy wiersz przy różnicowaniu”?
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>
AKTUALIZACJA:
teraz napisałem skrypt Ruby, który sprawdza najnowsze 10 wersji i konwertuje CR na LF.
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
git diff -b
- pokazałem to na stackoverflow.com/a/46265081/58794git diff --ignore-cr-at-eol
. Zobacz moją odpowiedź poniżej .git diff -b
jest identycznegit diff --ignore-space-change
.Odpowiedzi:
GitHub sugeruje , abyś używał \ n jako znaku nowej linii w repozytoriach obsługiwanych przez git. Istnieje opcja automatycznej konwersji:
Oczywiście mówi się, że konwertuje crlf na lf, podczas gdy chcesz przekonwertować crlf na lf. Mam nadzieję, że to nadal działa…
A następnie przekonwertuj swoje pliki:
core.autocrlf jest opisany na stronie manuala .
źródło
git config core.whitespace cr-at-eol
.warning: LF will be replaced by CRLF
zamiast tegowarning: CRLF will be replaced by LF
i jestem w systemie Linux. Masz pomysł, dlaczego? Chcę, żeby wszystko skończyło się na LF, a nie CRLF!git config --global core.autocrlf input
, wykonaj kroki w tej odpowiedzi (rm, add, commit), a dostanieszwarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.
. Usuń pliki (ponieważ mają oryginalny, niewłaściwy CRLF) i sprawdź je ponownie od ostatniego zatwierdzenia „Fix CRLF”.Podczas programowania w systemie Windows napotkałem ten problem podczas używania
git tfs
. Rozwiązałem to w ten sposób:To w zasadzie mówi Gitowi, że CR na końcu linii nie jest błędem. W rezultacie, te irytujące
^M
postacie pojawiają się już na końcu wierszygit diff
,git show
itpWygląda na to, że pozostawia inne ustawienia bez zmian; na przykład dodatkowe spacje na końcu linii nadal są wyświetlane jako błędy (podświetlone na czerwono) w pliku różnic.
(Nawiązały do tego inne odpowiedzi, ale powyższe dotyczy dokładnie ustawienia. Aby ustawić ustawienie tylko dla jednego projektu, pomiń
--global
.)EDYCJA :
Po wielu zadaniach kończących linię miałem szczęście, pracując w zespole .NET, z tymi ustawieniami:
Jeśli chcesz użyć ustawienia białych znaków, prawdopodobnie powinieneś włączyć je tylko dla poszczególnych projektów, jeśli chcesz wchodzić w interakcje z TFS. Po prostu pomiń
--global
:Jeśli chcesz usunąć niektóre podstawowe ustawienia. *, Najprostszym sposobem jest uruchomienie tego polecenia:
Spowoduje to otwarcie globalnego pliku .gitconfig w edytorze tekstu i łatwe usuwanie linii, które chcesz usunąć. (Lub możesz umieścić „#” przed nimi, aby je skomentować.)
źródło
core.autocrlf
natrue
git config --global core.whitespace cr-at-eol
wyłączy inne domyślne ustawienia. Istnieją trzy wartości domyślne: blank-at-eol, blank-at-eof i spacja-przed-tab. Aby włączyć cr-at-eol, zachowując te, których będziesz potrzebowaćgit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
.cr-at-eol
pozbyłem się^M
na końcu linii wgit diff
porządku, ale GIT nadal pokazywał te linie jako różne, chociaż zakończenie linii było jedyną różnicą.Spróbuj
git diff --ignore-space-at-eol
, albogit diff --ignore-space-change
, albogit diff --ignore-all-space
.źródło
autocrlf
ustawień. Dzięki!Zobacz także:
lub równoważnie
gdzie
whitespace
poprzedza znak tabulacji .źródło
git show
) przestało mnie denerwować o^M
s na zmienionych liniach! :)git diff
nadal pokazuje ^ M znaków.git config --global core.whitespace cr-at-eol
(gdzie --global jest opcjonalny, jeśli chcesz go tylko na repozytorium, na którym jesteś)[core]
aby móc zastąpićcore.
prefiks znakiem TAB.^M
sięgit diff
, a nie o tym, jak nie umieścić w ^ M w pierwszej kolejności. Oznacza to, że zaakceptowana zmianacore.autocrlf
nie jest najlepsza, ponieważ cicho zmienia pliki bez potwierdzenia użytkownika.Dlaczego masz takie
^M
w twojejgit diff
?W moim przypadku pracowałem nad projektem opracowanym w systemie Windows i korzystałem z systemu OS X. Kiedy zmieniłem trochę kodu, zobaczyłem
^M
na końcu wierszy, które dodałemgit diff
. Myślę, że^M
były wyświetlane, ponieważ były innymi zakończeniami linii niż reszta pliku. Ponieważ reszta pliku została opracowana w systemie Windows, używała onaCR
końcówek linii, aw OS X używaLF
końcówek linii.Najwyraźniej programista Windows nie użył opcji „ Kasa w stylu Windows, zatwierdzania zakończeń linii w stylu Unix ” podczas instalacji Gita.
Co więc powinniśmy z tym zrobić?
Możesz poprosić użytkowników Windows o ponowną instalację git i skorzystanie z opcji „ Kasa w stylu Windows, zatwierdzanie zakończeń linii w stylu Unix ”. Tak wolałbym, ponieważ widzę Windows jako wyjątek w postaci znaków kończących wiersz, a Windows rozwiązuje w ten sposób swój problem.
Jeśli wybierzesz tę opcję, powinieneś jednak naprawić bieżące pliki (ponieważ nadal używają
CR
końcówek linii). Zrobiłem to, wykonując następujące kroki:Usuń wszystkie pliki z repozytorium, ale nie z systemu plików.
Dodaj
.gitattributes
plik, który zmusza niektóre pliki do użyciaLF
jako zakończenia linii. Umieść to w pliku:Zamień
.ext
na rozszerzenia plików, które chcesz dopasować.Dodaj wszystkie pliki ponownie.
Spowoduje to wyświetlenie takich wiadomości:
Możesz usunąć
.gitattributes
plik, chyba że masz upartych użytkowników systemu Windows, którzy nie chcą używać opcji „ Kasa w stylu systemu Windows, zatwierdzaj zakończenia linii w stylu uniksowym ”.Zaangażuj się i pchnij wszystko.
Usuń i pobierz odpowiednie pliki ze wszystkich systemów, w których są używane. W systemach Windows upewnij się, że teraz używają opcji „ Kasa w stylu Windows, zatwierdzaj zakończenia linii w stylu Unix ”. Powinieneś to również zrobić w systemie, w którym wykonałeś te zadania, ponieważ po dodaniu plików git powiedział:
Możesz zrobić coś takiego, aby usunąć pliki:
A następnie, aby odzyskać je z poprawnymi zakończeniami linii:
Oczywiście zastępując
.ext
je wybranym rozszerzeniem.Teraz twój projekt używa tylko
LF
znaków na końcu linii, a paskudneCR
postacie nigdy nie wrócą :).Inną opcją jest wymuszenie zakończenia linii w stylu Windows. Możesz również użyć
.gitattributes
do tego pliku.Więcej informacji: https://help.github.com/articles/dealing-with-line-endings/#platform-all
źródło
View
->Line Endings
i kliknąćUnix
.^M
znaczy? Czy to nowa linia w systemie Windows lub Linux? Czy jest to po prostu „inna” nowa linia w porównaniu do innych nowych linii w pliku?git config --global core.autocrlf true
jest przesadą, a anty-Windows / anty-CR
kampania wydaje się styczna do pytania.Będzie jeden z Gitem 2.16 (Q1 2018), ponieważ
diff
rodzina poleceń nauczyła się ignorować różnice w zwrocie karetki na końcu wiersza.Zobacz commit e9282f0 (26 października 2017 r.) Autor: Junio C Hamano (
gitster
) .Pomocnik: Johannes Schindelin (
dscho
) .(Połączone przez Junio C Hamano -
gitster
- w commit 10f65c2 , 27 listopada 2017)źródło
git config --global core.autocrlf true
zgodnie z przyjętą odpowiedzią, odpowiada to bardziej bezpośrednio na pytanie PO: „Czy istnieje opcja typu„ traktuj ^ M jak nowy wiersz, gdy się różni ”?”.git version 2.20.1 (Apple Git-117)
ale naprawiłem ją, dodając odpowiedź core.pager Jasona Pyerona. YMMV oczywiście.TL; DR
Zmienić
core.pager
się"tr -d '\r' | less -REX"
, a nie w kodzie źródłowymDlatego
Te nieznośne ^ M pokazane są jako artefakt koloryzacji i pager. Jest to spowodowane
less -R
domyślną opcją git pager. (domyślny pager gita toless -REX
)Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że
git diff -b
nie pokaże zmian w białych spacjach (np. \ R \ n vs \ n)Ustawiać:
Szybki test, aby utworzyć plik unix i zmienić zakończenia linii, nie pokaże żadnych zmian za pomocą
git diff -b
:Zauważamy, że wymuszenie mniejszej rury nie pokazuje ^ M, ale włącza kolor i
less -R
:Poprawka jest pokazana za pomocą potoku, aby usunąć \ r (^ M) z wyjścia:
Rozsądną alternatywą jest użycie
less -r
, ponieważ przejdzie ona przez wszystkie kody kontrolne, a nie tylko kody kolorów.Jeśli chcesz bezpośrednio edytować plik konfiguracyjny git, jest to wpis do aktualizacji / dodania:
źródło
\r\n
zakończenia linii, a niektóre\n
zakończenia linii (nie wiem, czy to istotne); diffs tego pierwszego pokazał^M
w zmodyfikowanych liniach (czyli+
liniach).core.autocrlf
został ustawiony natrue
. Bieganiegit config core.pager "tr -d '\r' | less -REX"
pozbyło się nieznośnych^M
. Dzięki!git diff -b
tego szukałem, ale doceniam dokładne wyjaśnienie.[core]
sekcji pliku git „config” poprzez dodaniepager = tr -d '\\r' | less -REX
była jedyną odpowiedzią, która działała dla mnie. Dziękuję Ci!Długo zmagałem się z tym problemem. Zdecydowanie najłatwiejszym rozwiązaniem jest nie martwić się o znaki ^ M i po prostu użyć wizualnego narzędzia do różnicowania, które może je obsłużyć.
Zamiast pisać:
próbować:
źródło
W moim przypadku czym było to polecenie:
Źródło: https://public-inbox.org/git/[email protected]/T/
źródło
Jak zauważył VonC, zostało to już uwzględnione w git 2.16+. Niestety nazwa opcji (
--ignore-cr-at-eol
) różni się od nazwy używanej przez GNU diff, do której jestem przyzwyczajony (--strip-trailing-cr
).Kiedy miałem do czynienia z tym problemem, moim rozwiązaniem było wywołanie diff GNU zamiast wbudowanego diff gita, ponieważ mój git jest starszy niż 2.16. Zrobiłem to za pomocą tego wiersza poleceń:
Pozwala to na użycie
--strip-trailing-cr
i dowolne inne opcje GNU diff.Jest też inny sposób:
ale nie używa skonfigurowanych ustawień pagera, dlatego wolę ten pierwszy.
źródło