2010-03-18 29 views
15

Tôi có kho lưu trữ Git có một số tệp có định dạng DOS (\r\n kết thúc dòng). Tôi chỉ muốn chạy các tập tin thông qua dos2unix (mà sẽ thay đổi tất cả các tập tin định dạng UNIX, với kết thúc dòng \n), nhưng làm thế nào xấu này sẽ ảnh hưởng đến lịch sử, và nó được đề nghị ở tất cả?Git: Xóa trả về vận chuyển từ các tệp được kiểm soát nguồn

Tôi giả định rằng tiêu chuẩn là luôn sử dụng kết thúc dòng UNIX cho các tệp được kiểm soát nguồn và tùy chọn chuyển sang kết thúc dòng cụ thể cho hệ điều hành cục bộ?

+1

câu hỏi liên quan cho những người quan tâm đến việc này: http://stackoverflow.com/questions/446244/are-crlf-lines-ok-in-a-rails-project-deployed-on-linux – Blixt

Trả lời

10

Cách tiếp cận bạn sẽ phải sử dụng tùy thuộc vào mức độ công khai của kho lưu trữ của bạn.

Nếu bạn không quan tâm hoặc quan tâm đến việc thay đổi tất cả SHA vì bạn ít nhiều chỉ sử dụng SHA nhưng muốn sắp xếp vấn đề này mọi lúc, bạn có thể chạy git filter-branch và áp dụng dos2unix cho tất cả tệp trong mỗi lần commit. (Nếu bạn đang chia sẻ kho lưu trữ, mọi người khác cần nhiều hơn hoặc ít hơn để hoàn toàn gia hạn, vì vậy điều này có khả năng gây nguy hiểm.)

Vì vậy, lựa chọn tốt hơn và cách dễ dàng hơn là thay đổi chỉ trong các trình hiện tại . Điều này có nghĩa là các cam kết trước đây của bạn vẫn có các kết thúc \r\n nhưng trừ khi bạn đang thực hiện nhiều lựa chọn anh đào từ quá khứ, điều này không phải là vấn đề. Các công cụ khác có thể phàn nàn thường xuyên hơn một chút, tất nhiên, nhưng thông thường bạn sẽ chỉ khác với các cam kết trong vùng lân cận, vì vậy vấn đề này tự giải quyết khi các cam kết tích lũy.

Và kết thúc dòng UNIX là tiêu chuẩn, bạn chính xác về điều đó. Cách tiếp cận tốt nhất là thiết lập trình soạn thảo của bạn để chỉ ghi các kết thúc này ngay cả trên các cửa sổ. Nếu không, cũng có cài đặt autocrlf mà bạn có thể sử dụng.


bổ sung lịch sử viết lại phần:

Thời gian qua tôi đã làm như vậy, tôi đã sử dụng lệnh sau để thay đổi tất cả các file để kết thúc unix.

#!/bin/bash 
all2dos() { find * -exec dos2unix {} \; } 
export -f all2dos 
git filter-branch -f --tree-filter 'all2dos' --tag-name-filter cat --prune-empty -- --all 
+0

Cảm ơn. Ngay bây giờ tôi là người duy nhất làm việc trên kho lưu trữ, vì nó khá "trẻ" nên lịch sử viết lại không phải là vấn đề. Nhưng làm thế nào tốt 'git lọc-branch' chơi với github (tôi đã đặt kho lưu trữ trên đó)? – Blixt

+0

Tôi nghĩ rằng, bạn sẽ phải xóa tất cả các chi nhánh và thẻ trên github để đảm bảo rằng chúng có thể được tạo lại. (Nó * có thể * làm việc mà không có điều đó, nhưng có lẽ tốt hơn để bắt đầu lại.) Ngoài ra, bạn xóa toàn bộ repo và sau đó chỉ cần đẩy nó một lần nữa. Điều này nên được tìm thấy với github trừ khi một số người đã nhân bản từ nó. Sau đó, họ sẽ cần phải làm như vậy, tùy thuộc vào mức độ thông thạo của họ với git. – Debilski

+0

Được rồi. Tôi vừa xóa kho lưu trữ và đẩy lại nó với lịch sử đã được làm lại. Tôi cần phải khắc phục một số vấn đề với một số thư cam kết cũ là nhiều dòng, dù sao đi nữa. – Blixt

4

Để biết giải pháp tiếp tục, hãy xem lõi.autocrlf (và core.safecrlf) config parameters. Làm điều này một lần để toàn bộ kho lưu trữ của bạn sẽ chỉ tạo ra một cam kết đó là khá không thể hợp nhất với (vì mỗi dòng trong các tập tin sẽ được sửa đổi), nhưng một khi bạn vượt qua nó, nó sẽ không có vấn đề lớn. (Có, bạn có thể sử dụng git filter-branch để thực hiện sửa đổi tất cả các cách thông qua lịch sử, nhưng đó là một chút đáng sợ.)

22

Điều crlf này làm chúng tôi điên khi chúng tôi chuyển đổi từ svn sang git (trong một trung tâm (trần) như) môi trường scm. Cuối cùng, chúng tôi đã sao chép tệp .gitconfig toàn cục vào thư mục gốc của người dùng (yep cả windows và linux) với tệp ban đầu đến từ hệ thống Windows và có core.autocrlf = true và core.safecrlf = false trên những người dùng Linux (như kịch bản bash không hoạt động và tất cả những người xấu xa^M). Vì vậy, ban đầu chúng tôi đã thực hiện một kiểm tra và bản sao kịch bản mà đã làm một dos2unix sau khi các lệnh này. Sau đó, tôi chạy qua các mục cấu hình core.autocrlf và core.safecrlf và đặt chúng dựa trên O/S:

Windows: core.autocrlf = true và core.safecrlf = false Linux: core.autocrlf = input và cốt lõi.safecrlf = false

Chúng được thiết lập với: --- trên Windows ---

git config --global core.autocrlf true 
git config --global core.safecrlf false 

--- trên Linux ---

git config --global core.autocrlf input 
git config --global core.safecrlf false 

Sau đó, các nhà phát triển Linux, chúng ta thiết lập một chút bash script/usr/local/bin/gitfixcrlf:

#!/bin/sh 
# remove local tree 
git ls-files -z | xargs -0 rm 
# checkout with proper crlf 
git checkout . 

Chúng chỉ chạy trên địa phương của chúng ndbox nhái một lần. Bất kỳ nhân bản nào trong tương lai đều được thực hiện một cách chính xác. Bất kỳ cú đẩy đẩy nào trong tương lai giờ đây được xử lý đúng cách. Vì vậy, điều này đã giải quyết được nhiều vấn đề O/S của chúng tôi với các linefeeds. Cũng lưu ý rằng Mac rơi trong cùng một cấu hình như Linux.

0

Nếu danh sách các tập tin phiên bản kiểm soát bao gồm những chương trình, hoặc bạn không thể thay đổi lịch sử một cách dễ dàng ... đây là một tiện dụng dandy một liner:

https://unix.stackexchange.com/a/365679/112190

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