2012-11-02 19 views
5

Sự cốSử dụng Git làm cầu nối giữa Git và SVN Repos?

Nhóm của tôi sử dụng git để kiểm soát nguồn trên bitbucket, khách hàng của chúng tôi sử dụng Subversion trong nhà. Làm thế nào nhóm của chúng tôi có thể tiếp tục sử dụng git trong khi có mã kiểm tra vào Subversion? Và, không, tôi không nghĩ git-svn sẽ hoạt động.

Yêu cầu

Đội tuyển của tôi muốn sử dụng một giải pháp git tinh khiết, không git-svn. Lý do cho điều này là khách hàng của chúng tôi đã cấp cho chúng tôi quyền truy cập vào môi trường svn của họ chỉ trong mạng LAN văn phòng của chúng tôi; chúng tôi không thể cam kết svn khi làm việc ra khỏi văn phòng.

Cách tiếp cận của tôi

Tôi nghĩ rằng tôi có thể kiểm tra các kho subversion sử dụng git-svn, sau đó thêm dụ bitbucket git của chúng tôi như một điều khiển từ xa để kho svn git-bọc cùng. Một công việc cron sau đó có thể làm git pull từ repo bitbucket của chúng tôi, sau đó thực hiện một git svn dcommit để đẩy các thay đổi trong bitbucket đến kho lưu trữ lật đổ của ứng dụng khách của chúng tôi.

Đây là vấn đề vì lý do git sẽ luôn cho thấy tôi là 'x' số phiên bản trước kho lưu trữ git bitbucket sau khi quá trình kéo, svn dcommit kết thúc.

Trong khi không có gì lạ bên ngoài đang xảy ra, tại một số điểm tôi tự tin khách hàng của chúng tôi sẽ bắt đầu thực hiện đăng ký vào kho lưu trữ lật đổ của họ mà tôi sẽ phải cuối cùng đẩy vào trường hợp bitbucket của chúng tôi.

Chi tiết kỹ thuật

Dưới đây là một loạt sơ bộ bước tôi đã sử dụng để cố gắng làm việc này:

git svn clone -s http://svn.my-client.us/my-proj/ 
cd my-proj 
git remote add origin path-to-bitbucket-repo 
git fetch origin 
git checkout -b develop remotes/develop 
git branch --set-upstream develop origin/develop 
git pull 
#add merge comment here 
git svn rebase 
git svn dcommit #takes a while to transfer all the individual commits 

Sau khi tất cả các bên trên, thực hiện git status:

[[email protected] myDir]$ git st 
# On branch develop 
# Your branch is ahead of 'origin/develop' by 59 commits. 
# 
nothing to commit (working directory clean) 

Vì tôi cần có khả năng thực hiện đăng ký từ bất kỳ địa điểm nào, không chỉ trong khi tôi đang ở văn phòng, có bất kỳ địa điểm nào không trategy để sử dụng nó như là cầu nối để làm điều này?

Cảm ơn!

Trả lời

4

Cách tiếp cận của bạn là chính xác, nhưng bạn phải lưu ý rằng dcommit ghi lại lịch sử thậm chí còn gián đoạn hơn một cách bình thường rebase. Ví dụ, nó gắn thêm một dòng git-svn-id cho mỗi cam kết được cam kết với svn. Đây là lý do tại sao chi nhánh develop của bạn xuất hiện trước origin/develop - bởi vì nó có 59 cam kết tất cả chứa git-svn-id trong thư và không có thư nào trong số này xuất hiện trong origin/develop. Kết quả là, bạn sẽ phải rebase git chi nhánh của bạn sau mỗi dcommit, hoặc ít nhất là trước khi dcommit tiếp theo. Điều này có nghĩa là đẩy mạnh để viết lại lịch sử của thượng nguồn:

git push -f origin develop 

Nếu bất kỳ nhánh nào khác dựa trên dòng này, chúng sẽ phải được rebased trên đó.

Phần CAVEATS của git-svn man page đi vào chi tiết hơn, vì vậy bạn chắc chắn nên đọc nó.

Các thay đổi được thực hiện bởi khách hàng của bạn ở phía svn sẽ tự động được tích hợp vào chi nhánh phát triển của bạn qua số git svn rebase và cuối cùng truy cập bitbucket qua số git push -f ở trên.

Nếu loại công việc này không thỏa mãn bạn, thì có thể đáng xem SubGit. Tôi chưa bao giờ thử nó, nhưng họ tuyên bố sẽ cung cấp một sự tích hợp ít hơn nhiều giữa hai SCM.

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