2009-04-28 27 views
131

Làm cách nào để tôi có thể ngã ba và đồng bộ hóa với kho lưu trữ Subversion của Google Code mà tôi không có quyền ghi vào, vào kho lưu trữ GitHub?Ngã ba và đồng bộ hóa kho lưu trữ Subversion của Google Code vào GitHub

Tôi muốn có thể phát triển các tính năng của riêng mình trong kho lưu trữ Git, nhưng tôi cũng muốn đồng bộ hóa với kho lưu trữ Subversion của Google Code. Để tìm các bản sửa lỗi từ phía dự án Google Code.

Tôi biết về git-svn và sử dụng nó trước khi lên và xuống đến một kho lưu trữ Subversion mà tôi có toàn quyền kiểm soát. Nhưng tôi không biết cách đồng bộ hóa với kho lưu trữ Subversion của Google Code.

Trả lời

178

Nhánh từ xa từ git-svn khá giống với từ xa Git thông thường. Vì vậy, trong kho lưu trữ cục bộ của bạn, bạn có thể có bản sao git-svn của bạn và đẩy các thay đổi ra GitHub. Git không quan tâm. Nếu bạn tạo bản sao git-svn của bạn và đẩy các thay đổi chính xác tương tự ra GitHub, bạn sẽ có một bản sao không chính thức của kho lưu trữ Google Code. Phần còn lại là vanilla Git.

git svn clone http://example.googlecode.com/svn -s 
git remote add origin [email protected]:example/example.git 
git push origin master 

Bây giờ bạn có điều này, đôi khi bạn sẽ phải đồng bộ hóa kho lưu trữ Subversion với Git. Nó sẽ giống như thế:

git svn rebase 
git push 

Trong gitk hoặc bất cứ điều gì, điều này sẽ giống như thế này:

o [master][remotes/trunk][remotes/origin/master] 
| 
o 
| 
o 

Và khi bạn chạy git svn rebase, bạn sẽ có điều này:

o [master][remotes/trunk] 
| 
o 
| 
o [remotes/origin/master] 
| 
o 
| 
o 

Vì vậy, bây giờ chạy git push sẽ đẩy những cam kết đó ra GitHub, chi nhánh [điều khiển từ xa/nguồn gốc/chính] tại đó. Và bạn sẽ quay lại kịch bản trong sơ đồ nghệ thuật ASCII đầu tiên.

Vấn đề bây giờ là, cách bạn thực hiện các thay đổi của mình trong hỗn hợp? Ý tưởng là, bạn không bao giờ cam kết vào cùng một nhánh mà bạn đang git-svn-rebase-ing và git-push. Bạn cần một nhánh riêng cho các thay đổi của bạn. Nếu không, bạn sẽ kết thúc việc rebasing các thay đổi của bạn trên đầu trang của Subversion những cái mà có thể làm bất cứ ai làm nhái kho Git của bạn. Theo tôi? OK, vì vậy bạn tạo một chi nhánh, hãy gọi nó là "tính năng". Và bạn thực hiện một cam kết và đẩy nó ra để GitHub đến các chi nhánh tính năng. Gitk của bạn sẽ trông giống như sau:

o [features][remotes/origin/features] 
| 
o 
| 
o [master][remotes/trunk][remotes/origin/master] 
| 
o 

Ở đây bạn có các tính năng của bạn phân nhánh một vài cam kết trước chi nhánh Google Code, phải không? Vậy điều gì xảy ra khi bạn muốn kết hợp nội dung mới từ Google Code? Bạn muốn chạy git svn rebase đầu tiên và có được điều này:

      o [features][remotes/origin/features] 
[master][remotes/trunk] o | 
         | o 
         o/
         |/ 
         o[remotes/origin/master] 
         | 
         o 

Nếu bạn git push chủ ra, bạn có thể tưởng tượng [điều khiển từ xa/gốc/master] là tại cùng một điểm như là bậc thầy. Nhưng chi nhánh tính năng của bạn không có thay đổi. Các lựa chọn của bạn bây giờ là hợp nhất chính vào các tính năng hoặc các tính năng rebase.Hợp nhất sẽ trông giống như thế này

git checkout features 
git merge master 

      o [features] 
      /| 
     /o [remotes/origin/features] 
[master] o | 
     | o 
     o/
     |/ 
     o 
     | 
     o 

Sau đó, bạn đẩy tính năng ra GitHub. Tôi đã để lại các điều khiển từ xa cho chủ để tiết kiệm không gian, chúng sẽ ở cùng một điểm như [chính].

Cách tiếp cận rebase hơi ác hơn - bạn phải push bằng - force vì push của bạn sẽ không phải là sự hợp nhất nhanh (bạn sẽ kéo chi nhánh tính năng từ một người đã nhân bản nó). Nó không thực sự được coi là OK để làm điều này, nhưng không ai có thể ngăn cản bạn nếu bạn được xác định. Nó làm cho một số điều dễ dàng hơn, chẳng hạn như khi các bản vá được chấp nhận ngược dòng ở dạng hơi được làm lại. Nó muốn tiết kiệm có để mess về với các cuộc xung đột, bạn chỉ có thể rebase --skip các bản vá upstreamed. Dù sao, một rebase sẽ như thế này:

git rebase master features 

     o [features] 
     | 
     o 
     | o [remotes/origin/features] 
[master] o | 
     | o 
     o/
     |/ 
     o 
     | 
     o 

Và sau đó bạn sẽ phải git push --force đó. Bạn có thể thấy lý do tại sao bạn cần ép buộc, lịch sử có một chủ nghĩa cũ lớn từ [điều khiển từ xa/nguồn gốc/tính năng] tới +1 hiện tại mới được rebase [tính năng].

Tất cả đều hoạt động, nhưng rất nhiều nỗ lực. Nếu bạn định trở thành người đóng góp thường xuyên, việc đặt cược tốt nhất là làm việc như thế này một lúc, gửi một số bản vá ngược dòng và xem bạn có thể truy cập vào Subversion hay không. Không có điều đó, có lẽ không đẩy những thay đổi của bạn ra GitHub. Giữ chúng ở địa phương và cố gắng để chúng được chấp nhận ngược dòng.

+0

Cảm ơn các hướng dẫn tuyệt vời. ('git' noob here.) Câu hỏi nhanh. Tôi đã làm điều này chống lại một repo SVN lớn và nó đã phát ra ~ 141 megabyte. Tôi đã đẩy nó vào github và sau đó nhân bản nó trở lại, và nó lên đến 130 megabyte. Tôi chạy 'git gc' trên cả hai. Điều gì có thể giải thích cho sự khác biệt? – mpontillo

+0

... đã tìm ra. Tôi cần 'git push origin --mirror'. – mpontillo

+0

Làm việc giống như một sự quyến rũ, bây giờ tôi chỉ cần nói với các devs googlecode gốc để sử dụng github với tôi: D – electblake

1

Hmm .. Trong công ty của tôi, tôi đã làm gần như giống nhau. Chỉ cần có cả hai .svn và .git repo trong cùng một thư mục (bạn kiểm tra svn repo và tạo git repo trong bản sao làm việc này).

Sau đó sử dụng svn up và git push đã làm điều đó. Tất nhiên nếu bạn phân tán rất nhiều, bạn sẽ phải kết hợp mọi thứ bằng tay.

+0

Ja phải, nhưng tôi muốn tránh có các dữ liệu meta .svn và đã hy vọng rằng git có thể sử dụng một repo svn như xuống dòng master – optixx

+0

Vì vậy, nó không phải là nó có thể thế nào để sử dụng git-svn để kiểm tra repo và git push to github? –

0

Tôi không hoàn toàn chắc chắn bạn muốn gì nhưng, tất nhiên bạn có thể kéo từ kho lưu trữ lật đổ và đẩy tới kho lưu trữ Git từ cùng một bản sao làm việc. Và bạn cũng có thể git svn dcommit quay lại kho lưu trữ lật đổ. Tuy nhiên, bạn không thể đồng bộ hóa kho lưu trữ GitHub với kho lưu trữ subversion. Ngoài ra, khi bạn có cam kết trong bản sao làm việc của bạn mà không có trong kho lưu trữ lật đổ, bạn sẽ cần phải rebase chúng nếu kho lưu trữ lật đổ được cập nhật, buộc bạn git push --force cam kết “mới” với GitHub.

10

Một hướng dẫn để đồng bộ hóa từ Google Code sang GitHub có sẵn tại fnokd.com. Tác giả sử dụng máy chủ từ xa luôn bật và một công việc định kỳ để tự động đồng bộ hóa và giữ thân SVN trong nhánh GitHub được gọi là "nhà cung cấp".

2

GitHub giờ đây hỗ trợ nhập trực tiếp các dự án lật đổ (xem http://help.github.com/import-from-subversion/). Chỉ cần tạo một repo mới và sau đó nhấp vào "Nhập từ Subversion" tại màn hình "Bước tiếp theo". Nó không hỗ trợ đồng bộ hóa hơn nữa, mặc dù: /.

+0

Phương pháp này không còn tồn tại nữa – magnetik

+0

Sử dụng https://import.github.com/new ngay để thay thế. Xem https://help.github.com/articles/importing-from-subversion/. –

15

dịch vụ svn2github

Trang web http://svn2github.com/ cung cấp dịch vụ đến ngã ba bất kỳ kho SVN truy cập công khai lên Github (tại https://github.com/svn2github/projectname). Tôi đã thử nó; khi nhấn "Make a mirror" nó dường như không làm gì trong vài giây và hiển thị thông báo "lỗi", nhưng nó thực sự hoạt động. Kho lưu trữ mới trong thực tế được tạo ra, chứa mã từ repo SVN.

Sau đó bạn sẽ ngã ba kho lưu trữ mà nó tạo và hoạt động trên ngã ba của riêng bạn. Sau đó, bạn sẽ gửi các thay đổi của mình cho dự án ngược dòng bằng cách sử dụng trình gỡ lỗi của họ.

Xem các kho lưu trữ hiện có trong người dùng Github của dịch vụ (ví dụ: "svn2github được đẩy để làm chủ tại svn2github/haxe 5 giờ trước"), dường như thường xuyên kéo các thay đổi từ kho SVN. Không có thông tin về người chạy dịch vụ trên trang web, vì vậy tôi sẽ không đặt cược vào nó tiếp tục chạy vô thời hạn, nhưng nó hoạt động ngay bây giờ (và nếu nó bị hỏng, bạn vẫn có thể cập nhật ngã ba của mình theo cách thủ công).

Launchpad

Nếu bạn không thiết lập về việc sử dụng Git và Github, thay thế khác là sử dụng Launchpad.net. Launchpad có thể tự động nhập SVN (cũng CVS) kho vào một chi nhánh bzr cá nhân. Để thực hiện việc này, hãy tạo dự án Launchpad, sau đó truy cập the new import page, chọn Subversion và nhập URL (ví dụ: http://projectname.googlecode.com/svn/trunk/). Tùy thuộc vào quy mô dự án, quá trình nhập ban đầu có thể mất tới vài giờ. Nhập khẩu tiếp theo sẽ chạy theo định kỳ.

Để biết thêm tài liệu, hãy xem VCS Imports on Launchpad Help.

0

tôi tìm thấy các hướng dẫn trên Yu-Jie Lin 's blog:

Đầu tiên bản sao các kho lưu trữ Subversion và đẩy đến Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo 
git remote add git-foo [email protected]:username/foo.git 
git push git-foo master 

Sau khi cam kết trong kho lưu trữ Subversion, chạy

cd /path/to/git-foo 
git svn fetch 
git svn rebase 
git push git-foo master 
Các vấn đề liên quan