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
.
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. –
@cebewee: dziękuję, i jak mam to wykorzystać w tym przypadku? Jak więc zdefiniować nazwę pliku wyjściowego? – Sk8erPeter
'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. –