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 push
sẽ đẩ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 push
thạ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.
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ạygit gc
trên cả hai. Điều gì có thể giải thích cho sự khác biệt?