problemy z kodowaniem danych wyjściowych dziennika git w wierszu polecenia systemu Windows 10

88

Problem

Jak git logprawidłowo wyświetlić dane wyjściowe polecenia w wierszu polecenia systemu Windows?

Przykład

sekwencja poleceń git prowadząca do problemu Jak widać, mogę poprawnie wpisywać znaki diakrytyczne, ale na git logwyjściu jest jakoś uciekany. Zgodnie z UTF-8tabelą kodowania kody między nawiasami kątowymi ( <i >) na wyjściu odpowiadają wcześniej wpisanym git configparametrom.

Próbowałem ustawić LESSCHARSETzmienną środowiskową utf-8jako sugerowaną w jednej z odpowiedzi na podobny problem, ale wynik jest zniekształcony:

wyjście dziennika git po ustawieniu LESSCHARSET = utf8

Wiem, że .git/configjest prawidłowo zakodowany, utf-8ponieważ jest obsługiwany gitkzgodnie z oczekiwaniami.

Prawidłowe wyjście gitk

Oto localewyjście polecenia, jeśli to konieczne

LANG=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_ALL=

EDYTOWAĆ:

Wynik jest taki sam również w czystym git-bash :

wprowadź opis obrazu tutaj

więc uważam, że problem jest niezależny od powłoki i dotyczy Gita lub samej jego konfiguracji.

Marcin Kłopotek
źródło
2
Czy wypróbowałeś rozwiązanie opisane w artykuleZnaki Unicode w wierszu poleceń systemu Windows - jak? ”?
jthill
Tak, wypróbowałem kilka stron kodowych, w tym 65001 (UTF-8), bez żadnego rezultatu. Wygląda na to, że polecenie chcp nie ma wpływu na sposób wyświetlania danych wyjściowych dziennika git. Jest zawsze wyświetlany w ten sam sposób.
Marcin Kłopotek
1
Przepraszam, jeśli pytanie brzmi głupio, ale dlaczego w ogóle używasz wiersza poleceń systemu Windows zamiast Git Bash? Lepiej nadaje się do używania Gita, rozmiar okna można zmieniać do pełnego ekranu, podpowiedź automatycznie pokazuje, w której gałęzi się znajdujesz itd.
kriegaex
To nie jest głupie @kriegaex, właściwie jest dobre. Używam git-bash zapakowanego w ConEmu do codziennego użytku. Wynik jest taki sam i.imgur.com/hMKz9D3r.png . Opisałem mój problem, podając przykłady z cmd.exe, aby nie mylić ludzi z innymi używanymi narzędziami zależnymi, ponieważ uważam, że problem jest niezależny od powłoki i dotyczy Gita lub jego konfiguracji.
Marcin Kłopotek

Odpowiedzi:

157

Dobra, trochę poeksperymentowałem i odkryłem, że polecenia Windows Git faktycznie potrzebują zmiennych UNIX, takich jak LC_ALLw celu prawidłowego wyświetlania polskich (lub innych znaków UTF-8). Po prostu spróbuj tego polecenia:

set LC_ALL=C.UTF-8

Następnie ciesz się wynikiem. Oto, co się stało na mojej konsoli (czcionka „Consolas”, nie jest chcpkonieczna):

Konsola systemu Windows CMD


Aktualizacja:

  • Cóż, aby polecenia systemu Windows, takie jak type(wyświetl plik na konsoli) działały poprawnie, potrzebujesz chcp 65001.
  • A jeśli wolisz polecenia z Git Bash, tak jak catTy korzystasz z wyżej wymienionych set LC_ALL=C.UTF-8.

Konsola Windows CMD, część 2


Aktualizacja 2: Jak wprowadzić zmiany na stałe

Jak powiedział użytkownik mono blaine , utwórz zmienną środowiskową LC_ALLi przypisz jej wartość C.UTF-8, globalnie lub tylko dla własnego profilu użytkownika (przepraszam za niemiecki zrzut ekranu):

Utwórz zmienną środowiskową

Następnym razem, gdy otworzysz konsolę procesora poleceń (cmd.exe), powinieneś zobaczyć wartość zmiennej podczas wydawania polecenia echo %LC_ALL%. W PowerShell powinieneś to zobaczyć podczas wydawania $env:LC_ALL.

Najprostszym sposobem na utrwalenie strony kodowej UTF-8 jest otwarcie regeediti dodanie nowej wartości o nazwie Autoruntypu string do sekcji HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processori przypisanie jej wartości chcp 65001.

Edytor rejestracji

Odtąd to polecenie będzie wykonywane przy każdym otwarciu nowej konsoli cmd.exe. Możesz nawet zobaczyć jego wynik w nowym oknie: „Aktywna strona kodowa: 65001”. (lub podobny w Twoim języku).

Aha, tak przy okazji: aby poprawnie wyświetlić plik zakodowany w UTF-8 w PowerShell, możesz użyć Get-Content -encoding UTF8 file.txtor cat -encoding UTF8 file.txt( catbędącego aliasem dla Get-Contentw PowerShell).

kriegaex
źródło
Zestaw LC_ALLnie jest potrzebny samemu gitowi. Inne narzędzia - dostarczane z instalacją git - podobnie jak lessdomyślny pager / zobacz core.pager używają LC_ALLwartości. Inne ważne wartości to język zlokalizowany, np. LC_ALL=de_DE.UTF-8Dla Niemców.
powrót 42
1
możesz ustawić zmienną środowiskową z wiersza poleceń za pomocąsetx LC_ALL C.UTF-8
anion
PowerShell 6 w ConEmu, to wystarczyło, aby dodać $env.LC_ALL='ClUTF-8'do$Profile
Andrew Spencer
66

Jeśli ktoś jest zainteresowany odpowiednikiem PowerShell set LC_ALL=C.UTF-8to to:

$env:LC_ALL='C.UTF-8'

Jednak działa to tylko dla bieżącej sesji. Aby to było trwałe, istnieją dwie możliwości:

  • utwórz zmienną środowiskową o nazwie LC_ALLz wartościąC.UTF-8
  • lub umieścić $env:LC_ALL='C.UTF-8'w swoim $Profilepliku
mono blaine
źródło
1
Lub dodaj go do swojego profilu PowerShell (wolę to od ustawienia globalnego, ponieważ używam tego samego profilu - przez git - na wielu komputerach).
Richard
3
Plik profilu można edytować, na przykład, uruchamiając: notepad $ profile Następnie dodaj gdzieś linię zgodnie z sugestią mono blaine, $ env: LC_ALL = 'C.UTF-8'
Tore Aurstad
Z PowerShell 6 + ConEmu na Windows 10: to działa, nic więcej nie było potrzebne
Andrew Spencer,
5

Używam git bashdalej WIN10. Jak dla mnie, 4 ustawienia wyglądają jak moje oczekiwania.

  • envoprawa. Dodaj LC_ALL=C.UTF-8, LESSCHARSET=UTF-8aby PATHna całym świecie.

  • gitconfig. git config --global i18n.logOutputEncoding utf-8.

  • git bashoprawa. Ustaw Options-> Text-> Character setna utf-8. Lub ustaw localei Character setoba na default. Wystarczy wybrać właściwy encoding.

Gotowe.

W.Perrin
źródło
Używam gitw wierszu poleceń systemu Windows i pierwsze dwa kroki rozwiązały problem w moim przypadku.
nglee
5

Używam Git przez Powershell Core v7.0.3 z posh-git zainstalowanym w terminalu Windows w systemie Windows 10.

Przeglądałem odpowiedzi i wypróbowałem wiele z nich. Rozwiązania, które sprawdziły się u mnie to:

Te rozwiązania działają oddzielnie. Zdecydowałem się użyć polecenia Git, ponieważ problem wydaje się być związany z Gitem, a profil Powershell pozostaje czystszy.

Ayşe Nur
źródło
Dzięki za ustawienie Git. Ustawienia Git działają dla mnie, ale stwierdziłem również, że ustawienie $env:LESSCHARSET='utf-8'działa dobrze również dla PowerShell 5 w terminalu Windows.
mloskot
0

Musiałem użyć wiersza poleceń programu Windows PowerShell zamiast domyślnego (Windowkey + X)

john ktejik
źródło
0

Miałem taki problem na Linuksie. Problem polegał na tym, że nie wygenerowałem lokalizacji. Więc moim wyjściem localebyło kantowanie wszystkich liter "C", bez UTF-8. Aby rozwiązać ten problem, odkomentowałem en_US.UTF-8i ru_RU.UTF-8w /etc/locale.gen. Następnie uruchamiam localectl set-locale LANG = ru_RU.UTF-8 i restartuję. I ponownie zalogowany do systemu. Po tym cyryllic był wyświetlany normalnie.

Rekin
źródło