2012-06-15 34 views
22

Tôi có một kho lưu trữ CVS lớn chứa các tệp trong ISO-8859-1 và muốn chuyển đổi tệp này thành git.Chuyển đổi mã hóa tệp git kho

Chắc chắn tôi có thể định cấu hình git để sử dụng ISO-8859-1 để mã hóa, nhưng tôi muốn có nó trong utf8.

Bây giờ, với các công cụ như iconv hoặc recode tôi có thể chuyển đổi mã hóa cho các tệp trong cây đang hoạt động của mình. Tôi có thể cam kết điều này với một tin nhắn như converted encoding.

Câu hỏi của tôi bây giờ là, có khả năng chuyển đổi toàn bộ lịch sử không? Hoặc khi chuyển đổi từ cv sang git hoặc sau đó. Ý tưởng của tôi là viết một kịch bản đọc từng cam kết trong kho git và chuyển đổi nó thành utf8 và cam kết nó trong một kho lưu trữ git mới.

Điều này có thể (Tôi không chắc về mã băm và cách đi qua các cam kết, chi nhánh và thẻ). Hoặc là có một công cụ có thể xử lý một cái gì đó như thế này?

+3

Có, bạn có thể viết lại lịch sử, nhưng có lẽ bạn không nên: Bạn không bao giờ nên viết lại một kho lưu trữ, mà bạn đã đẩy một nơi nào đó. Ý kiến ​​của tôi là: 'iconv' và một cam kết bình thường là con đường để đi. – KingCrunch

+1

OK, cảm ơn @KingCrunch. Nhưng kể từ khi tôi mới tạo kho git nó được đẩy đến hư không. Và tôi cũng sẽ chấp nhận để tạo một kho lưu trữ thứ hai với mã hóa '' utf8'' dựa trên lịch sử đầu tiên. Mà về cơ bản là giống nhau thay vì tôi sẽ không sửa đổi repo hiện tại. –

Trả lời

17

Bạn có thể thực hiện việc này với git filter-branch. Ý tưởng là bạn phải thay đổi mã hóa của các tập tin trong mỗi cam kết, viết lại mỗi cam kết khi bạn đi.

Trước tiên, hãy viết tập lệnh thay đổi mã hóa của mọi tệp trong kho lưu trữ. Nó có thể trông như thế này:

#!/bin/sh 

find . -type f -print | while read f; do 
     mv -i "$f" "$f.recode.$$" 
     iconv -f iso-8859-1 -t utf-8 < "$f.recode.$$" > "$f" 
     rm -f "$f.recode.$$" 
done 

Sau đó sử dụng git filter-branch để chạy kịch bản này hơn và hơn nữa, một lần mỗi cam kết:

git filter-branch --tree-filter /tmp/recode-all-files HEAD 

nơi /tmp/recode-all-files là kịch bản ở trên.

Ngay sau khi kho lưu trữ mới được nâng cấp từ CVS, bạn có thể chỉ có một nhánh trong git với lịch sử tuyến tính quay lại đầu. Nếu bạn có nhiều nhánh, bạn có thể cần phải tăng cường lệnh git filter-branch để chỉnh sửa tất cả các cam kết.

+0

Tuyệt vời! Hiện tại lệnh đang chạy trên kho git thử nghiệm. Thật vậy, tôi đã có rất nhiều chi nhánh, tôi chỉ cần kiểm tra các tài liệu, tôi chỉ cần thêm '' --all'' để lọc tất cả các chi nhánh? –

+0

Đối với tất cả những người khác, 'git filter-branch --tree-filter/tmp/recode-all-files - --all'' lọc tất cả các nhánh. –

+1

Tôi đang cố gắng sử dụng câu trả lời của bạn nhưng tôi nhận được một recode-all-files: không tìm thấy lệnh. Tôi đang sử dụng mac, có vẻ như đã cài đặt biểu tượng, tôi không biết liệu tôi có phải đặt cài đặt bổ sung trên – marimaf

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