2013-08-07 30 views
7

Một người bạn và tôi đang làm việc trên cùng một tệp .cs cùng một lúc và khi có xung đột hợp nhất git chỉ ra có xung đột nhưng tệp không được tải bằng công cụ "HEAD" ">>>" thông thường bởi vì tệp .cs là các tệp nhị phân. Vì vậy, chúng tôi đã thêm nhiều thứ (* .cs văn bản và vv) - vào tệp .gitattributes của chúng tôi để biến git coi nó là tệp văn bản không hoạt động.Git không thể khác biệt hoặc hợp nhất .cs tệp trong mã hóa utf-16

Thats khi chúng tôi nhận ra rằng git có thể phân biệt các tệp .cs khác và không phải tệp này. Lý do cho điều đó là bởi vì nó trong mã hóa unicode vì nó chứa một số ký tự Trung Quốc.

Vậy làm cách nào để chúng tôi tạo các tệp git diff hoặc merge có định dạng utf-16 hoặc utf-8?

Điều thú vị là nếu tôi nhấn, gitlab sẽ hiển thị chính xác những gì khác biệt. Vì vậy, tôi không nhận được như thế nào git có thể khác trên máy chủ nhưng không phải với bash.

+1

Tôi tin rằng câu hỏi sau đây đang thảo luận cùng một vấn đề: http://stackoverflow.com/questions/777949/can-i-make-git-recognize-a-utf-16-file-as-text –

+0

Có, Tôi đã thử điều đó. Tuy nhiên, diff hiển thị như thế này "@@@@@@@" vì vậy nó không giúp đỡ nhiều và nó sẽ không hợp nhất hoặc – user1879789

+0

Một công việc xung quanh có thể là sử dụng một công cụ khác biệt/hợp nhất. Bạn đã thử chưa –

Trả lời

4

Tôi đã gặp sự cố tương tự với tệp * .rc cho dự án C++ và tìm cách tốt nhất để giải quyết vấn đề này là sử dụng smudge của git và bộ lọc sạch để lưu trữ mọi thứ trong kho dưới dạng utf-8 và sau đó chuyển đổi thành utf -16 khi ghi vào thư mục làm việc.

Bằng cách này, mọi thứ git thực hiện như khác biệt, hợp nhất hoặc bất cứ thứ gì sẽ hoạt động trên văn bản utf8 mà không có vấn đề, nhưng bản sao làm việc của bạn sẽ có utf16.

Để cấu hình này, hãy chắc chắn rằng bạn đang sử dụng một phiên bản của git đã iconv có sẵn (các phiên bản gần đây nhất của msysgit làm) và thêm dòng sau vào tập tin ~/.gitconfig của bạn:

[filter "utf16"] 
    clean = iconv -f utf-16le -t utf-8 
    smudge = iconv -f utf-8 -t utf-16le 
    required 

sau đó, trong .gitattributes tập tin của bạn add:

*.rc filter=utf16 
resource.h filter=utf16 

Nếu bạn đã có file hiện có trong UTF16 lưu dưới dạng nhị phân, sau đó bạn cần phải loại bỏ chúng khỏi kho lưu trữ và tái thêm chúng.

git rm --cached <names-of-utf16-files> 
git commit -am "removed utf16 files" 
git add <names-of-utf16-files> 
git commit -am "added utf16 files as utf8" 

Và bây giờ mọi thứ sẽ hoạt động.

+3

Hãy cẩn thận với giải pháp này - .gitconfig là 100% phụ thuộc vào người dùng. Tôi khuyên bạn nên sử dụng nó để * bộ lọc * những gì _you_ xem và không * thay đổi * những gì được lưu trữ. Như trong, nếu ai đó kiểm tra điều này (hoặc nếu bạn làm trong một hoặc hai năm) mà không có dòng .gitconfig đó - * mã của bạn sẽ không biên dịch *. Tốt hơn nên sử dụng [diff "utf16"] so với bộ lọc, vì .rc * phải * được lưu trữ dưới dạng UTF-16 trong kho lưu trữ. –

Các vấn đề liên quan