2013-07-07 33 views
15

tuyên bố từ chối trách nhiệm: Theo Git, ý tôi là 'tôi' đã làm rối tung lên.Git đã làm hỏng các tệp của tôi, hiển thị các ký tự tiếng Trung ở một số nơi

Earlier, tôi muốn git-gui để cho tôi diffnó nghĩ là các tập tin nhị phân.

Vì vậy, tôi thực hiện một số thay đổi của tôi .\.gitattributes

*.ini  text 
*.inc  text 

But it didn't work.Then I made some changes để tôi .\.git\info\attributes

*.ini  text 
*.inc  text 
*.inc crlf diff 
*.ini crlf diff 

và nó làm việc.

Nhưng bây giờ khi tôi quay trở lại trước cam kết nó messes lên ...

chinese characters Đây là cách nó nên nhìn: english characters

Nó không xảy ra trong tất cả các tập tin. EDIT: Nó chỉ xảy ra trong các tệp có bất kỳ ký tự đặc biệt nào trong chúng.

Q: Có phải vấn đề với chính cam kết hay chỉ là một số cài đặt?
Hỏi: Tôi có thể phục hồi không?

+0

bạn có thể giải thích những gì bạn đang hiển thị trong ảnh chụp màn hình ở trên? Vấn đề là bản thân nội dung tập tin bị hỏng, hay sự khác biệt? – djs

+0

@djs Nội dung tệp bị sai. Đó là những ảnh chụp màn hình của tập tin thực tế (bị rối tung sau khi 'kiểm tra ra khỏi kho VS bình thường). Bạn có thể thấy nó là sai lầm (so với tập tin bình thường (ngay bên dưới nó)). – laggingreflex

Trả lời

23

Tệp ini của bạn được lưu trong UTF-16LE, mã hóa mà Windows mô tả sai là ‘Unicode’.

Công cụ tìm kiếm mặc định của Git không hoạt động trên UTF-16, vì nó không phải là mã hóa tương thích ASCII. Đây là lý do tại sao git phát hiện các tập tin như nhị phân ban đầu.

Chuyển đổi dòng mới LF/CRLF xem mỗi byte 0x0A dưới dạng dòng mới và thay thế bằng 0x0D-0x0A. Tuy nhiên, trong một tệp UTF-16LE, một dòng mới thực sự được báo hiệu bằng 0x0A-0x00 và thay thế bằng 0x0D-0x0A-0x00 có nghĩa là bạn có một số lượng byte lẻ, do đó, căn chỉnh của mỗi đơn vị mã hai byte trong dòng tiếp theo không đồng bộ. Do đó, mọi dòng khác bị xáo trộn.

lựa chọn của bạn là:

  1. Hoàn nguyên các thay đổi thuộc tính và để cho Git xử lý các tập tin như nhị phân (mất lợi ích của diffs).

  2. Lưu tệp bằng mã hóa tương thích ASCII. Có vẻ như nội dung của bạn không thực sự có bất kỳ ký tự không phải ASCII nào, vì vậy hy vọng đó không phải là vấn đề? Thông thường bạn sẽ muốn lưu tất cả các tệp của mình dưới dạng UTF-8 - đây là tương thích ASCII nhưng cũng cho phép sử dụng tất cả các ký tự Unicode. Nhưng điều đó phụ thuộc vào việc Rainmeter có hỗ trợ đọc các tệp INI được mã hóa như vậy (có thể là không).

  3. Định cấu hình git thành use a different diff tool, mặc dù điều này sẽ khiến người khác làm việc phức tạp hơn với repo của bạn.

+0

hãy kiểm tra xem utf8 có hoạt động không và nếu có, hãy thực hiện. – mnagel

+0

Câu trả lời hay. Có vẻ như git có lẽ có thể kiểm tra một BOM thông minh hơn về điều này. Tôi figured @ laggingreflex đã nhìn thấy tham nhũng do chuyển đổi dòng mới, nhưng vấn đề UTF-16 đã không xảy ra với tôi. Tôi đã tìm thấy một số cuộc thảo luận về vấn đề này cho [libgit2] (https://github.com/libgit2/libgit2/issues/1009), nhưng không có giải pháp. – djs

6

Gần đây tôi đã gặp sự cố tương tự.Chúng tôi có một dự án toàn .gitattributes tập tin ở cấp độ gốc, trong đó bao gồm các dòng: -

* text=auto 
*.sql  text 

Một trong đội của chúng tôi đã được viết mã SQL sử dụng SQL Management Studio đó, không biết đến anh ấy, được lưu các tập tin như UTF -16. Ông đã có thể kiểm tra mã để Git mà không có vấn đề, nhưng khi kiểm tra mã được dịch sang các ký tự Trung Quốc như mô tả của bài đăng này.

Một tập hợp hexdump của các tệp được đề cập đã xác nhận vấn đề thực sự là bản dịch của 0x000A thành 0x000A0D.

Đối với chúng tôi là giải pháp là để chuyển đổi các tập tin để ASCII sử dụng như sau: -

  1. Xóa các tập tin vi phạm từ thư mục làm việc
  2. Tạo một .gitattributes tập tin tạm thời trong thư mục địa phương để buộc git để kiểm tra tệp mà không thực hiện chuyển đổi kết thúc dòng. ví dụ. bao gồm dòng *.sql binary

  3. Kiểm tra (các) tệp từ Git. Bạn sẽ thấy rằng các tập tin chưa được dịch và không có ký tự Trung Quốc.

  4. Chuyển tệp thành ASCII. Chúng tôi sử dụng Notepad ++ cho điều này, nhưng nó cũng có thể sử dụng iconv, được cài đặt như một phần của Git cho Windows. Tôi nghĩ UTF-8 cũng sẽ là một tùy chọn nếu tệp chứa các ký tự không phải ASCII - nhưng điều này không cần thiết cho mục đích của chúng tôi.
  5. Kiểm tra-trong phiên bản ASCII của tập tin
  6. Xóa địa phương .gitattributes tập tin
-1

Trong trường hợp của tôi sử dụng tôi giải quyết nó bằng Notepad ++ và thay đổi mã hóa tập tin từ "UTF-8" thành "UTF- 8 BOM ". Các nhân vật Trung Quốc đã trở thành nhân vật gốc một lần nữa.

0

Để thêm giải thích tốt bằng @bobince. Một giải pháp cho vấn đề này (ngoại trừ các tệp có ký tự đặc biệt) là chuyển đổi mọi thứ thành utf-8. Tôi giải quyết điều này bằng cách chạy một kịch bản python trong notepad ++ trên tất cả các tập tin trong một thư mục (từ một máy tính mà không có các tập tin sai lầm).

Tôi thấy kịch bản gốc here

Một bản sao của notepad ++ python script:

import os; 
import sys; 
filePathSrc="C:\\Temp\\UTF8" 
for root, dirs, files in os.walk(filePathSrc): 
    for fn in files: 
     if fn[-4:] != '.jar' and fn[-5:] != '.ear' and fn[-4:] != '.gif' and fn[-4:] != '.jpg' and fn[-5:] != '.jpeg' and fn[-4:] != '.xls' and fn[-4:] != '.GIF' and fn[-4:] != '.JPG' and fn[-5:] != '.JPEG' and fn[-4:] != '.XLS' and fn[-4:] != '.PNG' and fn[-4:] != '.png' and fn[-4:] != '.cab' and fn[-4:] != '.CAB' and fn[-4:] != '.ico': 
     notepad.open(root + "\\" + fn) 
     console.write(root + "\\" + fn + "\r\n") 
     notepad.runMenuCommand("Encoding", "Convert to UTF-8 without BOM") 
     notepad.save() 
     notepad.close() 
Các vấn đề liên quan