2012-12-01 6 views
34

Tworząc diff poprawkę z Git Shell w Windows (przy użyciu GitHub for Windows), kodowanie charakter plastra będzie UCS-2 Little Endian według Notepad ++ (patrz zdjęcia poniżej).Powłoka Git w Windows: domyślne kodowanie znaków łatki to UCS-2 Little Endian - jak zmienić to na ANSI lub UTF-8 bez LM?

Jak mogę zmienić to zachowanie i zmusić git do tworzenia poprawek z ANSI lub UTF-8 bez kodowania znaków BOM?

Powoduje to problem, ponieważ nie można zastosować łatek UCS-2 Little Endian, muszę ręcznie przekonwertować go na ANSI. Jeśli nie, otrzymam błąd "fatalny: nierozpoznany wpis"

Creating git patch

Notepad++ screenshot of the character encoding


Odtąd, ja też sobie sprawę, że trzeba ręcznie konwertować EOL z formatu Windows (\r\n) do UNIX (\n) w Notepad ++ (Edycja> EOL konwersji> UNIX). Jeśli tego nie zrobię, otrzymam błąd "końcowy odstęp" (nawet jeśli wszystkie spacje są przycięte: "TextFX"> "TextFX Edit"> "Trim Trailing Spaces").

Więc kroki muszę zrobić dla plastra należy stosować:

  1. utworzyć łatę (here is the result)
  2. convert character encoding to ANSI
  3. EOL conversion to UNIX format
  4. zastosować plaster

proszę , spójrz na ten zrzut ekranu:

Applying a patch in Windows Powershell with Git is problematic

+1

Nie jest to bezpośrednia odpowiedź na to pytanie, jednak kanoniczny sposób stworzyć poprawkę dla aplikacji, nie tylko do spożycia przez ludzi nie jest 'git diff', ale' git-formatu patch' - co nie domyślnie wyjście do stdout, domyślam się, że nie będziesz miał problemu ze zniekształconym kodowaniem znaków. –

+0

@cebewee: dziękuję, i jak mam to wykorzystać w tym przypadku? Jak więc zdefiniować nazwę pliku wyjściowego? – Sk8erPeter

+0

'git format-patch' pobiera pojedyncze zatwierdzenie X (czyli HEAD..X) lub zakres zatwierdzania i tworzy pliki dla każdego z tych zatwierdzeń o nazwie NNNN-SUBJECT.łatka, gdzie NNNN jest rosnącą liczbą, a SUBJEC to zmącona wersja tematu zatwierdzenia. –

Odpowiedz

16

Nie jestem użytkownikiem systemu Windows, więc weź moją odpowiedź z przymrużeniem oka. Zgodnie z Windows PowerShell Cookbook, PowerShell preprocesuje wyjście git diff, dzieląc je na linie. Dokumentacja Cmdlet Out-File sugeruje, że > jest taka sama jak | Out-File bez parametrów. Mamy również znaleźć ten komentarz w PowerShell documentation:

wynikach za pomocą apletu polecenia Out-File nie może być to, czego się spodziewać, jeśli jesteś przyzwyczajony do tradycyjnych przekierowania wyjścia. Aby zrozumieć jego zachowanie, musisz mieć świadomość kontekstu, w którym działa polecenie cmdlet Out-File.

Domyślnie polecenie cmdlet Out-File tworzy plik Unicode.Jest to najlepsze ustawienie domyślne na dłuższą metę, ale oznacza to, że narzędzia oczekujące plików ASCII nie będą działały poprawnie z domyślnym formatem wyjściowym. Możesz zmienić domyślny format wyjściowy do ASCII za pomocą parametru Kodowanie:

[...]

Out-File Format pliku zawartość wyglądać wyjścia konsoli. Powoduje to, że dane wyjściowe są obcięte tak, jak w większości przypadków w oknie konsoli. [...]

Aby uzyskać dane wyjściowe, które nie wymuszają zawijania linii w celu dopasowania do szerokości ekranu, można użyć parametru Szerokość, aby określić szerokość linii.

Tak więc, najwyraźniej to nie Git wybiera kodowanie znaków, ale Out-File. Sugeruje to a) że przekierowanie PowerShell powinno być używane tylko dla tekstu i b), aby uniknąć problemów z kodowaniem. Jednak nadal nie rozwiązuje problemu z końcówkami linii systemu Windows i Unix. Istnieją Cmdlets (zobacz PowerShell Community Extensions), aby wykonać konwersję końców linii.

Jednak to całe przekodowywanie nie zwiększa mojej pewności co do łaty (która sama w sobie nie ma kodowania, ale jest tylko ciągiem bajtów). Wspomniany wcześniej Cookbook zawiera skrypt Invoke-BinaryProcess, który może być użyty do przekierowania wyjścia niezmodyfikowanego polecenia.

Aby obejść tę kwestię, alternatywą byłoby użycie git format-patch zamiast git diff. format-patch zapisuje bezpośrednio do pliku (a nie do standardowego), więc jego dane wyjściowe nie są rekodowane. Jednak może tworzyć tylko poprawki z zatwierdzeń, a nie dowolne różnice.

format-patch wykonuje szereg wykonać (np master^10..master^5) lub jeden zatwierdzanie (przykład X oznacza X..HEAD) i tworzy łatek formularza NNNN-SUBJECT.patch, gdzie NNNN zwiększenie liczby 4-cyfrowy i przedmiotem jest (zniekształcony) temat łaty. Katalog wyjściowy można określić przy pomocy -o.

+0

Znalazłem, że autorytatywna odpowiedź jest podana w [Windows PowerShell Cookbook] (http://www.pavleck.net/powershell-cookbook/ch02 .html # pipe-binary-data). –

+0

Wezwanie do użycia Invoke-BinaryProcess powinno być zgodne z następującymi argumentami: 'Invit-BinaryProcess git -RedirectOutput diff | Out-File -encoding OEM my.patch' –

+1

Bardzo dziękuję za tak ładnie szczegółową odpowiedź. _ "Jednakże może tworzyć tylko poprawki z zatwierdzeń, a nie dowolne różnice." _ Tak, niestety oznacza to problem podczas próby utworzenia łat Drupala jako sugestii, że został zatwierdzony. Jak zasugerowałeś, wypróbowałem potok Out-File z definiowaniem kodowania jako ASCII: http://i.imgur.com/2Nx9Z.png; tutaj jest ten z domyślnym kodowaniem znaków (używając '>' do przekierowania wyjścia): http://i.imgur.com/QdyAN.png, i oto jest jeden z twoim rozwiązaniem: http://i.imgur.com/ 7Fpz0.png, i tak, kodowanie jest teraz ANSI. :) – Sk8erPeter

1
  1. Iconv wyjściowy dyferencjału
  2. Dla łatek zwykły 7bit (czystym angielskim) można zignorować szalony Notepad ++ wykrywanie: patch treść nie zawiera żadnego charset-definition
+0

dzięki za odpowiedź, ALE 1.) dlaczego "iconv" jest inny niż konwersja kodowania znaków ręcznie w Notepad ++? 2.) Dlaczego ignorowanie kodowania znaków rozwiązało problem, że * te poprawki UCS2 Little Endian-encoded NIE mogą być stosowane? * Proszę spojrzeć na ten zrzut ekranu: http://i.imgur.com/2698k.png. Jak widać, pojawia się komunikat o błędzie _ "fatal: nierozpoznane dane wejściowe" _. Zauważyłem również, że muszę ręcznie przekonwertować EOL z Windows na UNIX w Notepad ++. Jak tylko przekonwertuję łatkę na ANSI i skonwertuję EOL na UNIX, problem zniknie ... interesujący. – Sk8erPeter

+0

Proszę spojrzeć na moje edytowane pytanie, dodałem kilka zrzutów ekranu! Dzięki! – Sk8erPeter

+0

Cóż, nie mam pojęcia w tej sprawie, możesz poprosić lokalnych fantyków git. Próbujesz wykonać te same operacje z innym klientem Git (mogą * działać * inaczej). –

3

Jeśli to pomoże każdemu, korzystanie ze starego dobrego Command Prompt zamiast PowerShell działa bezbłędnie; Wydaje się, że nie występują żadne problemy z PowerShella dotyczące kodowania znaków i EOL.

enter image description here

3

Jeśli używasz PowerShell można też po prostu zrobić:

cmd /c "git diff > patch.diff" 

To sprawia, że ​​polecenia do wykonania przez CMD który zapisuje do pliku wyjściowego, jak jest.

1

Doing dos2unix na różnicę generowaną na powłoce uruchamiającej wydaje mi się dla mnie skuteczny. Byłem wtedy w stanie pomyślnie uzyskać apply różnicę.

dos2unix.exe diff_file 
git apply diff_file 
Powiązane problemy