2011-08-25 35 views
11

Tôi đã tạo bản repo của mình với autocrlf=true và sau đó thực hiện một số lần thanh toán và cam kết với autocrlf=false. Sau đó chuyển về autocrlf=true (OS Win). Mọi thứ có vẻ ổn, cho đến khi tôi bắt đầu một số kết hợp giữa các nhánh. Nhiều xung đột hợp nhất xuất hiện, trong đó toàn bộ tệp được đánh dấu là đã thay đổi do thay đổi eols (Tôi cho rằng đó là các tệp đó, đã được kiểm tra và cam kết với autocrlf=false).Cách sửa CRLF trong kho GIT để tránh xung đột hợp nhất

Có một số lịch sử có giá trị đối với tôi, vì vậy tôi muốn thực hiện một số chuyển đổi hoặc sửa đổi cam kết với chuyển đổi eols thay vì tạo repo mới và bắt đầu cuộc sống mới.

Đây là cách tôi hiểu autocrlf (OS Win):

trường hợp nếu autocrlf=true

WorkingTree -> commit -> GITRepository 
CRLF   CRLF to LF  LF 
LF   no conv.  LF 
WorkingTree <- checkout <- GITRepository 
CRLF   LF to CRLF  LF 

trường hợp nếu autocrlf=false

WorkingTree -> commit -> GITRepository 
CRLF   no conv.  CRLF 
LF   no conv.  LF 
WorkingTree <- checkout <- GITRepository 
CRLF   no conv.  CRLF 
LF   no conv.  LF 

Bây giờ tôi muốn sử dụng GIT với autocrlf=false, vì vậy Tôi quyết định thanh toán từng chi nhánh, sửa chữa eols của các tệp nguồn với tiện ích EOL converter và com mit trở lại với CRLF. Tôi đã làm nó, nhưng sau thời gian, vẫn còn một số tập tin, mà có lẽ không được kiểm tra sau khi tôi thay đổi thiết lập của autocrlf đến false (hoặc những tập tin này đến để hợp nhất từ ​​cam kết không cố định cũ hơn? Trong quá trình chuyển đổi tôi sử dụng mặt nạ * .filetype để tự động xử lý tất cả LF sang CRLF để không có giải thích nào khác cho tình huống như vậy đối với tôi). Tôi cũng đã cố gắng để touch các tệp, để cam kết lại tất cả (như tôi đã thấy một nơi nào đó ở đây trong stackoverflow) nhưng thay đổi ngày không có liên quan cho GIT AFAIK. Tôi cũng đã đọc How to undo the damage of autocrlf, nhưng không chắc đó là trường hợp của tôi và cũng không hiểu thủ thuật của thuật sĩ.

Làm cách nào để thoát khỏi mớ hỗn độn này?

+0

bạn đã thử 'autocrlf = input' chưa? nếu repo của bạn không được công bố công khai, bạn có thể sử dụng nó và 'filter-branch --index-filter' để xóa các kết thúc dòng trong lịch sử của bạn – knittl

+1

@knittl: Nếu tôi hiểu, điều này sẽ viết lại tất cả các commit trong lịch sử với LF. Tôi có đúng không? Sau đó, tôi có lẽ sẽ phải bật 'autocrlf = true' để nhận' CRLF' sau khi thanh toán (OS Win). Có một tùy chọn để chuyển đổi repo trực tiếp sang 'CRLF' và để lại' autocrlf = false' sau đó không? – Andik

+0

khi kho lưu trữ được chuyển thành CRLF, bạn sẽ có thể có 'autocrlf = false', do đó không có kết thúc dòng nào được chuyển đổi và giữ nguyên cách trong tệp – knittl

Trả lời

1

Sử dụng tùy chọn git merge "ignore-space-change" hoặc "ignore-all-space" cho chiến lược "đệ quy". Tùy chọn này tối thiểu là 1.7.4.1.

-2

Câu trả lời dễ dàng: Trừ khi bạn ĐANG đang tạo lập trình nền tảng x với không phải Windows, hãy đặt giá trị này thành false. Không cần phải kiểm soát nguồn của bạn để bastardize các tập tin của bạn cho bạn. Sau khi khắc phục mọi vấn đề còn lại, bạn nên bay. Hãy chắc chắn rằng những người khác làm việc với bạn cũng đặt điều này thành false.

+2

Tôi đề nghị để có tùy chọn này luôn luôn đúng trên cửa sổ - bạn sẽ chạy vào rất nhiều rắc rối với plattforms khác nếu bạn thực sự không. – Charminbear

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