Czy można git merge
zignorować różnice w końcówkach linii?
Może zadaję złe pytanie ... ale:
Próbowałem uisng, config.crlf input
ale sprawy trochę się pogmatwały i wymknęły się spod kontroli, szczególnie gdy zastosowałem go po fakcie .
Po pierwsze, zastosowanie tej konfiguracji po fakcie nie wydaje się wpływać na pliki, które zostały zatwierdzone do repozytorium przed zastosowaniem tej opcji. Inną rzeczą jest to, że nagle wszystkie zatwierdzenia powodują teraz wiele irytujących komunikatów ostrzegawczych o konwersji CRLF do LF.
Szczerze mówiąc, nie obchodzi mnie, jakie zakończenie linii jest używane, osobiście wolę styl uniksowy \n
, ale nieważne. Wszystko, na czym mi zależy, to git merge
być nieco mądrzejszym i ignorować różnice w zakończeniach linii.
Czasami mam dwa identyczne pliki, ale git oznaczyłby je jako będące w konflikcie (a konflikt dotyczy całego pliku) po prostu dlatego, że używają innego znaku końca linii.
Aktualizacja:
Dowiedziałem się, że git diff
akceptuje --ignore-space-at-eol
opcję, czy byłoby możliwe, aby git merge
skorzystać z tej opcji?
git config merge.renormalize true
Odpowiedzi:
Aktualizacja 2013:
Nowsze wersje git autoryzacji za pomocą seryjnej ze strategią
recursive
i strategia opcji (-X
):Ale użycie „
-Xignore-space-change
” jest również możliwejakub.g komentuje również, że strategie działają również przy wybieraniu wiśni :
Działa to znacznie lepiej niż
ignore-all-space
.Oryginalna odpowiedź (maj 2009)
Łatka do ignorowania stylu eol została zaproponowana w czerwcu 2007 roku , ale dotyczy tylko
git diff --ignore-space-at-eol
, niegit merge
.W tym czasie zadawano pytanie:
Julio C Hamano nie był zbyt entuzjastyczny:
Ogólną ideą
git merge
jest poleganie na narzędziu do scalania innej firmy.Na przykład skonfigurowałem DiffMerge jako narzędzie do scalania Git, ustawiając zestaw reguł, który pozwala temu narzędziu scalającemu ignorować eol dla określonego typu plików.
Konfiguracja w systemie Windows z MSysGit1.6.3, dla sesji bash DOS lub Git, z DiffMerge lub KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Polecenia konfiguracyjne Git:
Konfiguracja git na poziomie systemu:
Skrypt DOS (uwaga: polecenie dos2unix pochodzi stąd i jest używane do symulacji uniksowego stylu eol. To polecenie zostało skopiowane do katalogu wymienionego na początku tej odpowiedzi.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
W tym momencie (naciśnięcie „return”) otworzy się DiffMerge lub KDiff3 i sam zobaczysz, które linie są faktycznie scalane, a które ignorowane.
Ostrzeżenie : plik wynikowy zawsze będzie w trybie eol systemu Windows (CRLF) z DiffMerge ...
KDiff3 oferuje zapisywanie w taki czy inny sposób.
źródło
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(działa to znacznie lepiej niżignore-all-space
)Szukałem tej samej odpowiedzi i znalazłem to
Więc uruchomienie tego polecenia w dowolnym repozytorium załatwi sprawę:
źródło
Po przeczytaniu https://stackoverflow.com/a/12194759/1441706 i https://stackoverflow.com/a/14195253/1441706
dla mnie to polecenie zadziałało idealnie:
źródło
Jak w tej odpowiedzi: https://stackoverflow.com/a/5262473/943928
Możesz spróbować:
git merge -s recursive -Xignore-space-at-eol
źródło
Pozostawiłem wszystko jako domyślne (np. Autocrlf = true), dotknąłem wszystkich plików (find. -Exec touch {} \;), pozwoliłem gitowi zobaczyć je jako „zmodyfikowane” i zatwierdzić je z powrotem i skończono z tym. W przeciwnym razie zawsze będziesz nękany irytującymi wiadomościami lub zaskakującymi różnicami lub będziesz musiał wyłączyć wszystkie funkcje białych znaków git.
Stracisz informacje o winie, ale lepiej zrobić to wcześniej niż później :)
źródło
„git merge -Xrenormalize” działa jak urok.
źródło
Nie wygląda na to, że można to zrobić bezpośrednio, ale ten post sugeruje obejście tego problemu.
http://osdir.com/ml/git/2009-02/msg02532.html
źródło
http://stahlforce.com/dev/index.php?tool=remcrlf
Próbowałem, ale jeśli po ostatniej linii w kodzie nie masz jeszcze CRLF, dodaje sam LF i plik wygląda na zmieniony w git. Poza tym to działa.
źródło
Wydaje mi się teraz, że najlepszym sposobem jest znormalizowanie końcówek linii na obu gałęziach (i zatwierdzenie) przed ich połączeniem.
Wyszukałem w Google „Convert crlf to lf” i znalazłem to jako pierwszy wynik:
http://stahlforce.com/dev/index.php?tool=remcrlf
Ściągnąłem go i użyłem, wygląda na fajne narzędzie.
Upewnij się jednak, że podałeś katalog i typ pliku (np. .Py), w przeciwnym razie może spróbować zepsuć zawartość
.git
katalogu!źródło
ODPOWIEDŹ, (nie próbowałem tego), możesz użyć
git diff
do porównania gałęzi, którą chcesz scalić ze wspólnym przodkiem, a następnie zastosować wynikigit apply
. Oba polecenia mają--ignore-whitespace
opcje ignorowania błędów końca linii i białych znaków.Niestety, jeśli łatka nie nakłada się poprawnie, cała operacja jest przerywana. Nie możesz naprawić konfliktów scalania. Istnieje
--reject
opcja pozostawienia niezaktualizowanych porcji w.rej
plikach, co pomaga, ale nie jest tym samym, co wyświetlanie konfliktów scalania w jednym pliku.źródło
Po przeczytaniu Rozwiąż konflikty scalania: Wymuś nadpisanie wszystkich plików
W końcu rozwiązałem moją wersję tego problemu. Próbowałem pobrać aktualizacje z zewnętrznego repozytorium, ale moje obecne miało problemy związane z CRLF i nie było w stanie scalić w rezultacie. Należy zauważyć, że NIE MIAŁEM ŻADNYCH LOKALNYCH ZMIAN, o które musiałem się martwić. Poniższe kroki rozwiązały mój problem:
Zgodnie z instrukcjami github dotyczącymi synchronizacji widelców ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Moje ograniczone rozumienie git mówi mi, że robi to, co chcę - ponowne bazowanie mojego forka (bez rzeczywistych niezatwierdzonych zmian), aby uzyskać wszystkie zmiany wprowadzone w zewnętrznym źródle. Według strony źródłowej ten krok nie powinien być zwykle wymagany, ale problem CRLF spowodował, że był wymagany.
git merge upstream/master
git push
źródło
git reset --hard upstream/master
wyrzuca twój lokalny oddział i wskazuje goupstream/master
, nie dającgit merge upstream/master
się oprzeć?jednak sugeruję użycie narzędzia takiego jak sed, aby uzyskać poprawne zakończenia linii, a następnie pliki różnic. Spędziłem kilka godzin na różnych projektach z różnymi zakończeniami linii.
Najlepszym sposobem było:
.git
katalog) do innego katalogu utwórz w nim repozytorium, a następnie dodaj pliki i zatwierdzaj je (powinno znajdować się w gałęzi master w nowym repozytorium).dev
(git checkout -b dev
), zatwierdź pliki w tej gałęzi i uruchom (jeśli pierwszy projekt jest w głównym):git diff master..dev --names-only
aby zobaczyć tylko nazwy zmienionych plikówźródło