2012-03-07 27 views
8

Tôi đã làm việc để di chuyển 9 dự án của chúng tôi trong một repo SVN trên 9 repo git riêng biệt, được quản lý trên máy chủ bởi gitolite rồi tắt SVN. Bảy trong số họ đã dễ dàng như họ không có chi nhánh hoặc thẻ vân vân trạm làm việc của tôi, tôi đã có thể làm một cách đơn giản:Di chuyển từ Subversion sang git, sao chép tất cả các nhánh và đẩy qua gitolit?

git svn clone --stdlayout --no-metadata -A svnauthors.txt svn+ssh://[email protected]/var/subversion/project tempProject 

Sau đó đẩy từ máy trạm của tôi vào gitolite cắt đứt qua:

git remote add origin ssh://[email protected]/project 
git push -u origin master 

và tất cả họ đều làm việc tuyệt vời. Bây giờ hai dự án cuối cùng khó khăn hơn, mỗi thẻ có khoảng 30 thẻ/nhánh. Sau khi chạy 'git svn bản sao' như trên trên một trong những dự án tôi thấy:

$ git branch -a 
* master 
    remotes/BatchUpload 
    remotes/clarify_breadcrumb 
    remotes/contact_type 
    remotes/contact_upload_improvements 
    remotes/file_cabinet 
    remotes/mobile 
    remotes/summary_tiles 
    remotes/summary_updates 
    remotes/tags/release-2.1.2 
    remotes/tags/release-3.0.1 
    remotes/tags/release-3.0.2 
    remotes/tags/release-3.0.2c 
    remotes/tags/release-3.1.1 
    remotes/tags/release-3.1.3 
    remotes/tags/release-3.1.4 
    remotes/tags/release-3.1.5 
    remotes/tags/release-3.1.5.UPDT 
    remotes/tags/release-3.2 
    remotes/tags/release-3.2.1 
    remotes/tags/release-3.2.2.1 
    remotes/tags/release-3.2.3 
    remotes/tags/release-3.2.4 
    remotes/tags/release-3.2.6 
    remotes/tags/release-3.2.7 
    remotes/tags/release-3.2.7.1 
    remotes/trunk 
    remotes/user_man_batch_upload 
    remotes/user_management 

Bây giờ làm thế nào để đi về nhận được tất cả những thẻ/cành tải về máy trạm địa phương của tôi để tôi có thể đẩy họ thông qua gitolite và tắt máy chủ SVN vĩnh viễn? Là những gì tôi cần làm trong this guide, thực hiện 'git checkout -b' cho từng chi nhánh và thẻ? Tôi có nên sử dụng svn2git hoặc một số công cụ khác cho việc này không?

Trả lời

11

Một người hữu ích trong việC#git trên freenode irc viết cho tôi một ít lệnh để có được thẻ và các chi nhánh của tôi sao chép sang Git từ SVN:

Đẩy ngành:

printf "git push origin "; git show-ref | grep refs/remotes | grep -v '@' | grep -v remotes/tags | perl -ne 'print "refs/remotes/$1:refs/heads/$1 " if m!refs/remotes/(.*)!'; echo 

Chạy lệnh đó mà in ra

thẻ Đẩy:

printf "git push origin "; git show-ref | grep refs/remotes/tags | grep -v '@' | perl -ne 'print "refs/remotes/tags/$1:refs/tags/$1 " if m!refs/remotes/tags/(.*)!'; echo 

Run lệnh đó mà in ra

+1

ý nghĩa của lệnh chạy là gì? –

+0

Oh sản lượng của nó là một lệnh .. cảm ơn tôi đã có rất nhiều chi nhánh mà làm cho tôi bối rối ... –

+0

Nó làm việc cho tôi. Nhưng tại sao không có lệnh ootb git cho nó? Hoặc, tại sao git push --all không thành công cho các nhánh git svn? – Christian

0

Chúng đã ở trên máy trạm cục bộ của bạn. Những gì bạn thấy chỉ là tham chiếu đến cam kết và bạn có thể kiểm tra các chi nhánh địa phương theo dõi chúng bất cứ khi nào bạn muốn.

git branch -a 

Hiển thị thông tin trong repo địa phương của bạn, không tìm nạp bất kỳ dữ liệu nào từ kho lưu trữ từ xa. Bạn có tất cả thông tin đó khi bạn đã sao chép.

Vì vậy, bây giờ chúng tôi có mọi thứ cục bộ, bạn chỉ cần đẩy dữ liệu đến điều khiển từ xa. Bạn có thể đẩy tất cả các thẻ của bạn đến máy chủ từ xa với:

git push --tags 

Đối với mỗi chi nhánh bạn có thể đẩy nó vào repo với:

git push origin remotes/BatchUpload:BatchUpload 
+0

chạy 'git push --tags' phản hồi bằng "Mọi thứ được cập nhật" và không có kết quả đầu ra nào khác, giống như chạy 'điều khiển từ xa git push origin/*: refs/heads/*' được cho là giống như bạn đã liệt kê ở trên ? Tuy nhiên nó không giống như bất kỳ chi nhánh hoặc thẻ tồn tại trên máy chủ sau khi chạy các lệnh. – xref

+0

Rất tiếc, sau đó bạn có thể phải chuyển đổi chúng thành thẻ theo cách thủ công hoặc bằng tập lệnh. Nếu bạn kiểm tra ví dụ từ xa/thẻ/release-2.1.2 với "git checkout remotes/tags/release-2.1.2" bạn có nhận được HEAD tách rời không? – ralphtheninja

+0

Dường như việc chuyển đổi từ svn sang git tạo ra các thẻ như là các tham chiếu từ xa (nhưng với một cách đặt tên lạ), vì vậy bạn có thể phải làm ví dụ: "git checkout điều khiển từ xa/thẻ/xyz; git tag xyz;" cho tất cả các tệp xyz trong thư mục .git/remotes/tags. Khi đã xong, git push --tags sẽ đẩy chúng vào điều khiển từ xa. Và bạn phải làm tương tự với các tham chiếu nhánh, git checkout -b xyz điều khiển từ xa/xyz (hoặc chỉ đơn giản là git branch xyz remotes/xyz) và git push origin xyz cho tất cả các tệp xyz trong thư mục .git/remotes. Khi bạn hoàn tất, bạn có thể xóa các tệp. – ralphtheninja

0

Sử dụng svn2git. Này chuyển đổi các thẻ vào git chú thích thẻ và những sau đó được đẩy đúng cách sử dụng git push --tags

+1

Bạn có thể vui lòng giải thích cách sử dụng svn2git để giải quyết vấn đề cụ thể cho OP không? –

0

Đây là những gì làm việc cho tôi:

git push origin refs/remotes/*:refs/heads/* 

lệnh này đẩy tất cả các điều khiển từ xa tạo ra trong quá lật đổ git di chuyển, hiển thị với git branch -a. Bao gồm tất cả các chi nhánh/thẻ đã bị xóa/hợp nhất mặc dù!

Bạn sẽ phải làm một số chi nhánh/thẻ không mong muốn dọn dẹp hoặc có lẽ converting branches to tags.

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