Sự cố mã hóa đầu ra git log trên dấu nhắc lệnh của Windows 10


88

Vấn đề

Làm thế nào để git loghiển thị đúng đầu ra lệnh trên cửa sổ lệnh nhắc nhở?

Thí dụ

chuỗi lệnh git dẫn đến sự cố Như bạn thấy, tôi có thể nhập các ký tự dấu phụ đúng cách nhưng trên git logđầu ra bằng cách nào đó bị thoát. Theo UTF-8bảng mã hóa, các mã giữa dấu ngoặc nhọn ( <>) từ đầu ra tương ứng với các git configtham số đã nhập trước đó .

Tôi đã cố gắng đặt LESSCHARSETbiến môi trường thành có đường utf-8trong một trong các câu trả lời cho vấn đề tương tự nhưng sau đó đầu ra bị cắt xén:

git log đầu ra sau khi thiết lập LESSCHARSET = utf8

Tôi biết .git/confignó được mã hóa đúng cách utf-8vì nó được xử lý gitknhư mong đợi.

Đầu ra gitk thích hợp

Đây là localeđầu ra lệnh nếu cần thiết

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=

BIÊN TẬP:

Đầu ra cũng giống như vậy trong git-bash thuần túy :

nhập mô tả hình ảnh ở đây

vì vậy tôi tin rằng vấn đề là độc lập với shell và liên quan đến Git hoặc chính cấu hình của nó.



Có, tôi đã thử một số trang mã bao gồm 65001 (UTF-8) mà không có kết quả. Có vẻ như lệnh chcp không ảnh hưởng đến cách hiển thị đầu ra git log. Nó luôn được hiển thị theo cùng một cách.
Marcin Kłopotek,

1
Xin lỗi nếu câu hỏi nghe có vẻ ngu ngốc, nhưng tại sao bạn lại sử dụng dấu nhắc lệnh của Windows thay vì Git Bash? Nó phù hợp hơn với việc sử dụng Git, cửa sổ có thể thay đổi kích thước thành toàn màn hình, lời nhắc tự động hiển thị cho bạn biết bạn đang ở chi nhánh nào, v.v.
kriegaex

Nó không phải là ngu ngốc @kriegaex, nó thực sự tốt. Tôi đang sử dụng git-bash được gói vào ConEmu để sử dụng hàng ngày. Kết quả là i.imgur.com/hMKz9D3r.png . Tôi đã mô tả sự cố của mình và đưa ra các ví dụ với cmd.exe để không khiến mọi người nhầm lẫn với các công cụ phụ thuộc khác đang sử dụng vì tôi tin rằng vấn đề là độc lập với shell và liên quan đến Git hoặc chính cấu hình của nó.
Marcin Kłopotek

Câu trả lời:


157

Được rồi, tôi đã thử nghiệm một chút và phát hiện ra rằng các lệnh Windows Git thực sự cần các biến UNIX như LC_ALLđể hiển thị các ký tự Ba Lan (hoặc các ký tự UTF-8 khác) một cách chính xác. Chỉ cần thử lệnh này:

set LC_ALL=C.UTF-8

Sau đó, tận hưởng thành quả. Đây là những gì đã xảy ra trên bảng điều khiển của tôi (phông chữ "Consolas", không chcpcần thiết):

CMD bảng điều khiển Windows


Cập nhật:

  • Để các lệnh của Windows như type(tệp hiển thị trên bảng điều khiển) hoạt động chính xác, bạn cần chcp 65001.
  • Và nếu bạn thích các lệnh từ Git Bash giống như catbạn kiếm lời từ những điều đã nói ở trên set LC_ALL=C.UTF-8.

Windows console CMD, phần 2


Cập nhật 2: Cách thực hiện các thay đổi vĩnh viễn

Như người dùng mono blaine đã nói, hãy tạo một biến môi trường LC_ALLvà gán giá trị cho nó C.UTF-8, trên toàn cầu hoặc chỉ cho hồ sơ người dùng của riêng bạn (xin lỗi vì ảnh chụp màn hình tiếng Đức):

Tạo biến môi trường

Lần tới khi mở bảng điều khiển bộ xử lý lệnh (cmd.exe), bạn sẽ thấy giá trị biến khi thực hiện lệnh echo %LC_ALL%. Trong PowerShell, bạn sẽ thấy nó khi phát hành $env:LC_ALL.

Cách đơn giản nhất để làm cho trang mã UTF-8 cố định là mở regeeditvà thêm một giá trị mới có tên Autorunkiểu chuỗi vào phần HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processorvà gán giá trị đó chcp 65001.

Biên tập viên đăng ký

Từ đó trở đi, lệnh này sẽ được thực thi mỗi khi bạn mở bảng điều khiển cmd.exe mới. Bạn thậm chí còn thấy đầu ra của nó trong cửa sổ mới: "Aktive Codepage: 65001." (hoặc tương tự bằng ngôn ngữ tương ứng của bạn).

Nhân tiện: Để hiển thị chính xác tệp được mã hóa UTF-8 trong PowerShell, bạn có thể sử dụng Get-Content -encoding UTF8 file.txthoặc cat -encoding UTF8 file.txt( catlà bí danh Get-Contenttrong PowerShell).


Set LC_ALLlà không cần thiết bởi bản thân git. Các công cụ khác - đi kèm với git installaion - giống như less, là máy nhắn tin mặc định / xem core.pager đang sử dụng LC_ALLgiá trị. Các giá trị hợp lệ khác là ngôn ngữ bản địa hóa, ví dụ: LC_ALL=de_DE.UTF-8cho người Đức.
trở lại42

1
bạn có thể thiết lập môi trường biến từ dòng lệnh sử dụngsetx LC_ALL C.UTF-8
anion

Powershell 6 trong ConEmu, nó là đủ để thêm $env.LC_ALL='ClUTF-8'vào$Profile
Andrew Spencer

66

Nếu bất kỳ ai quan tâm đến PowerShell tương đương set LC_ALL=C.UTF-8, đó là:

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

Tuy nhiên, điều này chỉ hoạt động cho phiên hiện tại. Để làm cho nó vĩnh viễn, hai khả năng:

  • tạo một biến môi trường có tên LC_ALLvới giá trịC.UTF-8
  • hoặc đưa $env:LC_ALL='C.UTF-8'vào $Profiletệp của bạn

1
Hoặc thêm nó vào hồ sơ PowerShell của bạn (Tôi thích cài đặt này hơn cài đặt chung vì tôi sử dụng cùng một cấu hình - qua git - trên nhiều máy).
Richard

3
Các tập tin hồ sơ có thể được chỉnh sửa bằng cách ví dụ chạy: notepad $ hồ sơ Sau đó, thêm một dòng ở đâu đó như mono Blaine đề nghị, $ env: LC_ALL = 'C.UTF-8'
Tore Aurstad

Với PowerShell 6 + ConEmu trên Windows 10: điều này hoạt động, không cần gì khác
Andrew Spencer

5

Tôi sử dụng git bashtrên WIN10. Đối với tôi, 4 cài đặt tạo ra sự xuất hiện như mong đợi của tôi.

  • envcài đặt. Thêm LC_ALL=C.UTF-8, LESSCHARSET=UTF-8để PATHtrên toàn cầu.

  • gitcấu hình. git config --global i18n.logOutputEncoding utf-8.

  • git bashcài đặt. Đặt Options-> Text-> Character setthành utf-8. Hoặc đặt localeCharacter setcả hai default. Nó là đủ thông minh để chọn chính xác encoding.

Làm xong.


Tôi sử dụng gittrên dấu nhắc lệnh của Windows và hai bước đầu tiên đã giải quyết được vấn đề cho trường hợp của tôi.
nglee

5

Tôi đang sử dụng Git qua Powershell Core v7.0.3 với posh-git được cài đặt bên trong Windows Terminal trên Windows 10.

Tôi đã xem qua các câu trả lời và thử nhiều câu trả lời. Các giải pháp phù hợp với tôi là:

Cả hai giải pháp này đều hoạt động riêng biệt. Tôi đã chọn sử dụng lệnh Git vì vấn đề dường như liên quan đến Git và hồ sơ Powershell vẫn sạch hơn.


Cảm ơn vì cài đặt Git. Cài đặt Git phù hợp với tôi, nhưng tôi cũng nhận thấy rằng cài đặt này cũng $env:LESSCHARSET='utf-8'hoạt động tốt đối với PowerShell 5 trong Windows Terminal.
mloskot

0

Tôi đã phải sử dụng dấu nhắc lệnh windows powershell thay vì dấu nhắc lệnh mặc định (Windowkey + X)


0

Tôi đã gặp vấn đề như vậy trên Linux. Và vấn đề là tôi đã không tạo ngôn ngữ. Vì vậy, đầu ra của tôi localelà không chứa tất cả các chữ cái "C", không có UTF-8. Để giải quyết vấn đề này, tôi đã bỏ ghi chú en_US.UTF-8ru_RU.UTF-8trong /etc/locale.gen. Sau đó, tôi chạy localectl set-locale LANG = ru_RU.UTF-8 và khởi động lại. Và được đăng nhập lại vào hệ thống. Sau đó vòng tròn được hiển thị bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.