2014-12-12 12 views
5

Nie sądzę, że jest to kwestia różnic kończących linię - p4merge nie uważa, że ​​w pliku nic się nie zmieniło, nawet jeśli ustawione jest rozpoznawanie różnic między wierszami i białymi odstępami między wierszami.Dlaczego git myśli, że każda linia nietkniętego pliku zmieniła się

Mój problem jest to, że czasami zdarza się co następuje:

  • Na pierwszy git status nie wykazuje niezatwierdzone zmiany.
  • Następnie czekam na kolejną gałąź
  • Teraz lista git status zawiera listę niektórych plików jako zmienione.
  • git diff na każdym z tych "zmienionych plików" pokazuje wszystkie wiersze pliku jako zmienione. Zmieniona wersja wygląda tak samo jak wersja oryginalna.

Dlaczego tak się dzieje? Dlaczego Git sądzi, że pliki się zmieniły, kiedy wydaje się, że tego nie zrobiły? Dlaczego po prostu sprawdzenie innej gałęzi powoduje to?

Moja pierwsza myśl to końcówki linii, ale nie wiem, dlaczego p4merge ich nie wykrył. Drugim pomysłem były zmiany trybu plików. Nie wiem, jak się dowiedzieć, czy tak jest. git config --list pokazuje, że core.filemode ma wartość false. git config --global --list i git config --system --list nie wyświetlają żadnych ustawień dla core.filemode (mówię to tutaj, ponieważ nie jestem pewien, w jaki sposób różne poziomy konfiguracji zastępują się nawzajem). core.autocrlf jest ustawione na true.

Wielu programistów zatwierdza to samo repozytorium, od którego ściągam zmiany, wszystkie na komputerach z systemem Windows. Zgaduję, że ktoś gdzieś ma jakieś ustawienie na stanowisku, które to powoduje, ale nie wiem, czy to ja jestem lokalnie, czy ktoś inny, albo jakie to może być ustawienie.

Pliki wymienione jako zmienione nie wydają się być przypadkowe - jeśli usunę moje lokalne repozytorium, sklonować go ponownie z pilota (który domyślnie głównego oddziału jest wyrejestrowany), a kasa ta sama gałąź znowu git status list dokładnie te same pliki co zmienione, za każdym razem. Pliki są czasem czymś ostatnio edytowanym, czasem plikami, które nie zostały dotknięte od lat. Są to nie tylko pliki binarne (które czasami są uszkodzone przez pliki binarne), ale również pliki tekstowe.

Wykonywanie poleceń git rm --cached -r ., po którym następuje git reset --hard, pozbywa się zmian, ale zdarza się tak często, że robi się kłopotliwe. Jestem też ciekawy, co może być przyczyną tego.

To samo repozytorium powoduje również problemy z kończeniem linii. Myślę, że jest to osobny problem, więc prawdopodobnie skończę z kolejnym pytaniem, ale wspominam o tym tutaj na krótko, na wypadek, gdyby było ono powiązane. Sprawdzeniu inny oddział lub ciągnięcie zmiany ze zdalnego repozytorium plików powoduje czasami pojawiają się zmieniły i git diff na tych plików wyłącznie wyjście warning: LF will be replaced by CRLF in [file]. The file will have its original line endings in your working directory.

Edycja: Plik .gitattributes repozytorium ma tylko linię * text=auto i nic w nim.

Wyjście git config --list (pominięta ustawieniami rzeczy jak kolory, ścieżek plik do edytora, zdalnego, difftool, nazwę użytkownika i adres e-mail i takie):

core.symlinks=false 
core.autocrlf=true3 
pack.packsizelimit=2g 
rebase.autosquash=true 
merge.summary=true 
core.repositoryformatversion=0 
core.filemode=false 
core.bare=false 
core.logallrefupdates=true 
core.symlinks=false (yes this is there twice, just noticed) 
core.ignorecase=true 
core.hidedotfiles=dotgitOnly 
+0

Co "git config core.autocrlf" zwraca w sklonowanym repo? Czy są jakieś ".gitattributes" z dyrektywami "core.eol"? – VonC

+0

Czy pracujesz zarówno nad Windows, jak i innymi programistami? Wygląda na to, że^M lub kilka innych znaków centrycznych Windows robi to w plikach. –

+0

@VonC 'git config core.autocrlf' wyświetla' true'. '.gitattributes' nie zawiera w sobie nic z' core.eol'. @Jeff Tak, pracuję w systemie Windows, tak jak każdy inny programista. Teraz jednak wydaje mi się, że repozytorium ma w sobie kilkuletnią historię, a deweloperzy pojawili się i odeszli. Nie wiem, czy w przeszłości ktoś pracował na innej platformie (wszystkie systemy Windows przynajmniej w ubiegłym roku, a problem ten zaczął się dopiero kilka miesięcy temu). – riksteri

Odpowiedz

4

aby pokazać te „niewidoczne” zmiany w szczegółach używać:

git diff --word-diff-regex=. 

Zaznacza wszystkie zmienione znaki, nawet białe znaki.

Najprawdopodobniej pokaże zmianę zakończeń linii. Jeśli pracujesz w systemie Windows i włączyłeś core.autocrlf, git może oczekiwać innego rodzaju zakończenia linii i pokazać "złą" linię kończącą się jako diff.

Mówiąc git, nie przejmuj się końcówkami linii, wyłączając core.autocrlf, aby rozwiązać problem.

+0

To pokazuje, że widocznie^M znak został usunięty z każdego wiersza. Dzięki za to! Nie rozwiązano tego, co jeszcze to powoduje, ale wydaje się, że teraz jest bliższe rozwiązania. – riksteri

+0

Mówiłeś git, aby zawsze przechowywać pliki z natywnymi zakończeniami linii (tj. Jednak plik zawiera zakończenia linii unix. Dlatego git zakłada, że ​​usunąłeś znak "^ M", który jest dokładnie różnicą między końcami linii. – michas

+0

Czy jest to spowodowane przez niektórych programistów, którzy mają ustawioną opcję 'core.autocrlf' i inni, więc nieoczekiwane zakończenia linii są przypisywane do bazy danych? Gdyby wszyscy mieli to samo ustawienie przez cały czas, czy byłby to problem, niezależnie od tego, czy wybrane ustawienie jest włączone czy wyłączone? Rozumiem, że można to naprawić, dodając odpowiednie ustawienia do '.gitattributes', aby uniemożliwić nam ustawienie' core.autocrlf' na odpowiednie ustawienie dla każdego programisty. Czy to jest poprawne? – riksteri

Powiązane problemy