Ngã ba và đồng bộ hóa kho lưu trữ Subversion của Google vào GitHub


131

Làm cách nào tôi có thể rẽ nhánh và giữ đồng bộ hóa với kho lưu trữ Subversion của Google mà tôi không có quyền truy cập ghi vào kho lưu trữ 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 Git của mình, nhưng tôi cũng muốn đồng bộ hóa với kho lưu trữ Google Code Subversion. Để tìm nạp 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 đây để lên và xuống dòng vào 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 làm thế nào để giữ đồng bộ hóa với kho lưu trữ Subversion của Google.

Câu trả lời:


178

Chi nhánh từ xa từ git-svn khá giống với một điều khiển 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ể sao chép git-svn của mình 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 mình và đưa 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à vani Git.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com: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ẽ trông giống như:

git svn rebase
git push

Trong gitk hoặc bất cứ điều gì, điều này sẽ trông 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ờ việc chạy git pushsẽ đẩy những cam kết đó ra GitHub, nhánh [điều khiển / nguồn gốc / chủ] ở đó. Và bạn sẽ trở lại kịch bản trong sơ đồ nghệ thuật ASCII đầu tiên.

Vấn đề bây giờ là, làm thế nào để bạn thay đổi thành hỗn hợp? Ý tưởng là, bạn không bao giờ cam kết trên cùng một nhánh mà bạn đang git-svn-rebase-ing và git-đẩy. Bạn cần một chi nhánh riêng cho những thay đổi của bạn. Nếu không, cuối cùng bạn sẽ chống lại các thay đổi của bạn trên đầu trang Subversion, điều này có thể làm phiền bất cứ ai nhân bản kho lưu trữ Git của bạn. Theo tôi? OK, vì vậy bạn tạo một 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 nhánh tính năng. Gitk của bạn sẽ trông giống như thế này:

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

Ở đây bạn đã có chi nhánh tính năng của mì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 các công cụ mới từ Google Code? Bạn sẽ chạy git svn rebaseđầu tiên và nhận đượ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 thành git pushthạo, bạn có thể tưởng tượng [điều khiển từ xa / nguồn gốc / chủ] ở cùng điểm với chủ. Nhưng nhánh tính năng của bạn không có thay đổi. Lựa chọn của bạn bây giờ là hợp nhất chủ vào các tính năng hoặc tính năng rebase. Một sự hợp nhất sẽ trô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 các tính năng ra GitHub. Tôi đã bỏ các điều khiển từ xa cho chủ để tiết kiệm không gian, chúng sẽ ở cùng điểm với [chủ] .

Cách tiếp cận rebase ác hơn một chút - bạn phải thúc đẩy - lực lượng vì lực đẩy của bạn sẽ không phải là sự hợp nhất nhanh chóng (bạn sẽ kéo nhánh tính năng từ bên dưới 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 bạn nếu bạn quyết tâm. Nó cũng làm cho một số thứ 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. Sẽ tiết kiệm được việc phải giải quyết các xung đột, bạn chỉ có thể khởi động lại - hãy xóa các bản vá ngược dòng. Dù sao, một cuộc nổi loạn 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 làm git push --forceđiều đó. Bạn có thể thấy lý do tại sao bạn cần phải ép buộc nó, lịch sử có một sự phân ly cũ lớn từ [điều khiển từ xa / nguồn gốc / tính năng] đến [tính năng] sau phản ứng mới .

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


Cảm ơn các hướng dẫn tuyệt vời. (không có gitở đây.) 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ó đã đạt tới ~ 141 megabyte. Tôi đẩy nó lên github và sau đó nhân bản nó xuống, và nó đạt tới 130 megabyte. Tôi chạy git gctrên cả hai. Điều gì có thể giải thích cho sự khác biệt?
mpontillo

... tìm ra. Tôi cần thiết git push origin --mirror.
mpontillo

Làm việc như một cơ duyên, bây giờ tôi chỉ cần nói với các nhà phát triển googlecode ban đầu sử dụng github với tôi: D
electblake

Điều này không làm việc cho tôi với -stùy chọn cho git svn clone, nhưng không có nó, phần còn lại hoạt động tốt.
dùng1027169

15

dịch vụ svn2github

Trang web http://svn2github.com/ cung cấp dịch vụ kết nối bất kỳ kho lưu trữ SVN nào có thể truy cập công khai vào Github (tại https://github.com/svn2github/projectname ). Tôi đã thử nó; Khi nhấn "Tạo gương", rõ ràng nó 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 trên thực tế đã được tạo, chứa mã từ repo SVN.

Sau đó, bạn sẽ rẽ nhánh kho lưu trữ mà nó tạo ra và làm việc 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 bugtracker của họ.

Nhìn vào 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ên thành chủ tại svn2github / haxe 5 giờ trước"), dường như nó thường xuyên kéo theo các thay đổi từ kho lưu trữ SVN. Không có thông tin về người điều hành dịch vụ trên trang web, vì vậy tôi sẽ không đặt cược vào việc nó tiếp tục chạy vô thời hạn, nhưng hiện tại nó vẫn hoạt động (và nếu nó ngừng hoạt động, bạn vẫn có thể cập nhật thủ công của mình).

Bệ phóng

Nếu bạn không cài đặt bằng Git và Github, một cách khác là sử dụng Launchpad.net. Launchpad có thể tự động nhập kho SVN (cũng CVS) vào chi nhánh bzr cá nhân. Để thực hiện việc này, hãy tạo dự án Launchpad, sau đó chuyển đến trang nhập mới , 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, việc nhập ban đầu có thể mất tới vài giờ. Nhập khẩu tiếp theo sẽ chạy định kỳ.

Để biết thêm tài liệu, hãy xem Nhập khẩu VCS trên Trợ giúp Launchpad .


10

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ột máy chủ từ xa luôn bật và một công việc định kỳ để tự động hóa đồng bộ hóa và giữ thân SVN trong một nhánh GitHub gọi là "nhà cung cấp".


2

GitHub hiện 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 thêm, mặc dù: /.


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

Thay vào đó, hãy sử dụng import.github.com/new ngay bây giờ. Xem help.github.com/articles/importing-from-subversion .
Chris Arndt

1

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

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


Ja đúng, nhưng tôi muốn tránh có dữ liệu meta .svn và hy vọng rằng git có thể sử dụng repos svn làm chủ luồng
optixx

Vì vậy, không thể sử dụng git-svn để kiểm tra repo và git đẩy vào github?
Marcin Gil

0

Tôi không chắc chắn những gì bạn muốn, nhưng, tất nhiên bạn có thể kéo từ kho lưu trữ lật đổ và đẩy sang kho Git từ cùng một bản sao làm việc. Và bạn cũng có thể git svn dcommitquay lại kho lưu trữ lật đổ. Mặc dù vậy, bạn không thể tạo đồng bộ hóa kho GitHub với kho lưu trữ lật đổ. Ngoài ra, khi bạn có các cam kết trong bản sao làm việc chưa có trong kho lưu trữ lật đổ, bạn sẽ cần phải khởi động lại chúng nếu kho lưu trữ lật đổ được cập nhật, buộc bạn phải thực hiện git push --forcecác lệnh mới của Commit vào GitHub.


0

Tôi tìm thấy những hướng dẫn này trên blog của Yu-Jie Lin :

Đầu tiên sao chép kho lưu trữ Subversion và đẩy vào Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Sau khi cam kết trong kho Subversion, hãy chạy

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.