Ugryzł mnie problem zakończenia linii w systemie Windows / Linux w programie git. Wydaje się, za pośrednictwem GitHub, MSysGit i innych źródeł, że najlepszym rozwiązaniem jest skonfigurowanie lokalnych repozytoriów do używania zakończeń linii w stylu linux, ale ustawionych core.autocrlf
na true
. Niestety nie zrobiłem tego wystarczająco wcześnie, więc teraz za każdym razem, gdy pociągam zmiany, zakończenia linii są przerywane.
Myślałem, że znalazłem tutaj odpowiedź , ale nie mogę zmusić jej do działania. Moja wiedza na temat wiersza poleceń w Linuksie jest w najlepszym wypadku ograniczona, więc nie jestem nawet pewien, co robi wiersz „xargs fromdos” w jego skrypcie. Ciągle otrzymuję wiadomości o braku takiego pliku lub katalogu, a kiedy udaje mi się wskazać istniejący katalog, mówi mi, że nie mam uprawnień.
Próbowałem tego z MSysGit w systemie Windows i za pomocą terminala Mac OS X.
źródło
Odpowiedzi:
Dokumentacja git dla gitattributes dokumentuje teraz inne podejście do „naprawy” lub normalizacji wszystkich zakończeń linii w twoim projekcie. Oto jego sedno:
Wykorzystuje to nową
--renormalize
flagę dodaną w git v2.16.0, wydanym w styczniu 2018 r. W przypadku starszych wersji git jest jeszcze kilka kroków:źródło
git reset
, proszę?git status
jest uruchomienie,git diff --ignore-space-at-eol
aby upewnić się, że jedynymi zatwierdzanymi przez ciebie zmianami są zakończenia linii.git reset
nie wykryje żadnych modyfikacji, a zatem jest bezużyteczny.--renormalize
flagą dodanej w git v2.16.0 który został wydany w styczniu 2018 roku--renormalize
flaga konsoliduje proces ponownego przetwarzania zakończeń linii dla każdego pliku śledzona do jednego polecenia:git add --renormalize .
.Najprostszym sposobem, aby to naprawić, jest dokonanie jednego zatwierdzenia, który naprawia wszystkie zakończenia linii. Zakładając, że nie masz żadnych zmodyfikowanych plików, możesz to zrobić w następujący sposób.
źródło
Moja procedura postępowania z zakończeniami linii jest następująca (przetestowana na wielu repozytoriach):
Podczas tworzenia nowego repozytorium:
.gitattributes
pierwsze zatwierdzenie wraz z innymi typowymi plikami jako.gitignore
iREADME.md
W przypadku istniejącego repozytorium:
.gitattributes
odpowiedniogit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
ma pominąć haczyki poprzedzające zatwierdzenie)alias fixCRLF="..."
W
.gitattributes
oświadczam jawnie, że wszystkie pliki tekstowe mają LOL EOL, ponieważ ogólnie narzędzia Windows są kompatybilne z LF, podczas gdy narzędzia inne niż Windows nie są kompatybilne z CRLF (nawet wiele narzędzi wiersza poleceń nodejs zakłada LF i dlatego może zmieniać EOL w twoich plikach).Zawartość
.gitattributes
Mój
.gitattributes
zwykle wygląda jak:Aby dowiedzieć się, jakie różne rozszerzenia są śledzone przez git w bieżącym repozytorium, spójrz tutaj
Problemy po normalizacji
Po wykonaniu tej czynności istnieje jeszcze jedno wspólne zastrzeżenie.
Powiedz, że Twój
master
jest już aktualny i znormalizowany, a następnie do kasyoutdated-branch
. Dość często zaraz po sprawdzeniu tej gałęzi, git zaznacza wiele plików jako zmodyfikowanych.Rozwiązaniem jest wykonanie fałszywego commit (
git add -A . && git commit -m 'fake commit'
), a następniegit rebase master
. Po zmianie bazy fałszywe zatwierdzenie powinno zniknąć.źródło
2.7.0.windows.1
użyłem następujących opcji:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Wyjaśnienie:
git status --short
Wyświetla każdą linię, której git jest i nie jest świadomy. Pliki, które nie są kontrolowane przez git są oznaczone na początku linii znakiem „?”. Pliki, które są modyfikowane, są oznaczone literą M.
grep "^ *M"
To odfiltrowuje tylko te pliki, które zostały zmodyfikowane.
awk '{print $2}'
Pokazuje tylko nazwę pliku bez żadnych znaczników.
xargs fromdos
Pobiera nazwy plików z poprzedniego polecenia i uruchamia je za pomocą narzędzia „fromdos” w celu konwersji końcówek linii.
źródło
dos2unix
zamiastfromdos
.Oto jak naprawiłem wszystkie zakończenia linii w całej historii za pomocą
git filter-branch
.^M
Postać musi być wprowadzona za pomocąCTRL-V
+CTRL-M
. Kiedyśdos2unix
konwertowałem pliki, ponieważ automatycznie pomija to pliki binarne.źródło
„| Xargs fromdos” odczytuje ze standardowego wejścia (
find
znalezione pliki ) i używa go jako argumentu poleceniafromdos
, które konwertuje zakończenia linii. (Czy fromdos jest standardem w tych środowiskach? Jestem przyzwyczajony do dos2unix). Zauważ, że możesz uniknąć używania xargs (szczególnie przydatne, jeśli masz wystarczającą liczbę plików, aby lista argumentów była zbyt długa dla xargs):lub
Nie jestem całkowicie pewien twoich komunikatów o błędach. Z powodzeniem przetestowałem tę metodę. Jaki program produkuje każdy? Do jakich plików / katalogów nie masz uprawnień? Oto jednak próba zgadnięcia, co to może być:
Jednym prostym sposobem na uzyskanie błędu „nie znaleziono pliku” dla skryptu jest użycie ścieżki względnej - użyj bezwzględnej. Podobnie możesz otrzymać błąd uprawnień, jeśli skrypt nie jest wykonywalny (chmod + x).
Dodaj komentarze, a postaram się pomóc.
źródło
ok ... w cygwinie nie mamy łatwo dostępnych fromdos, a ta awk podmuch pojawia się na twojej twarzy, jeśli masz jakieś spacje w ścieżkach do zmodyfikowanych plików (które mieliśmy), więc musiałem to zrobić nieco inaczej:
podziękowania dla @lloyd za większość tego rozwiązania
źródło
Wykonaj następujące kroki, jeśli żadna inna odpowiedź nie działa dla Ciebie:
git config --global core.autocrlf true
; jeśli korzystasz z Uniksa, zróbgit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
W takim razie twój lokal powinien być teraz czysty.
źródło
.gitattributes
pliku jest rozwiązaniem problemu z zakończeniami linii?