2009-02-21 27 views
37

Tôi tương đối mới với Git, nhưng tôi thấy nó dễ dàng để làm việc với ở nhà mà tôi muốn sử dụng nó tại nơi làm việc. trong kho Svn. Thật không may, các kho lưu trữ là hơi không chuẩn và tôi gặp khó khăn khi chúng được nhân bản. Chắc chắn, họ đều có thân cây, cành/và Thẻ /, nhưng chi nhánh/và Thẻ/có thư mục con trước khi nhấn thực thư mục dự án:Nhân bản một kho lưu trữ Svn không chuẩn với Git-Svn

trunk/ 
branches/maintenance/release1 
branches/maintenance/release2 
... 
branches/development/feature1 
branches/development/feature2 
... 
tags/build/build1 
tags/build/build2 
... 
tags/release/release1 
tags/release/release2 

Sau khi sao chép:

$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject 
$ git branch -r 
    development 
    [email protected] 
    maintenance 
    [email protected] 
    tags/build 
    tags/[email protected] 
    tags/release 
    tags/[email protected] 
    trunk 
    [email protected] 

tôi nhận được không của các nhánh hoặc thẻ dự án thực tế. Tôi thực sự cần để có thể làm việc trên thân cây, một chi nhánh bảo trì và một chi nhánh phát triển. Tôi đã thử phương pháp này ngoài một số hacks tại sửa đổi cấu hình, nhưng không có gì là làm việc cho tôi.

Có cách nào tôi có thể lấy các thành phần chính của dự án Svn không chuẩn của mình vào kho lưu trữ git cục bộ để tôi có thể dễ dàng di chuyển giữa chúng không?

Rất cám ơn.

CẬP NHẬT: Tôi nên thêm rằng tôi không thể chuyển đổi bán buôn sang Git (chưa). Có những thành viên khác trong nhóm tham gia và sự hiện diện quốc tế. Hậu cần của quá trình chuyển đổi là nhiều hơn tôi sẵn sàng thực hiện cho đến khi tôi cảm thấy thoải mái hơn nhiều với Git; như tôi đã đề cập, tôi vẫn còn khá mới. Tôi vừa mới trầy xước bề mặt khả năng của nó.

Trả lời

34

Lee B đã đúng. Câu trả lời, được cung cấp bởi doener trong #git, là nâng cấp Git lên 1.6.x (tôi đã sử dụng 1.5.x). 1.6.x cung cấp bản sao sâu để nhiều ký tự đại diện có thể được sử dụng với tùy chọn --branches:

$ git svn clone https://svn.myrepos.com/myproject web-self-serve \ 
      --trunk=trunk --branches=branches/*/* --prefix=svn/ 
$ git branch -r 
    svn/development/sandbox1 
    svn/development/feature1 
    svn/development/sandbox2 
    svn/development/sandbox3 
    svn/development/model-associations 
    svn/maintenance/version1.0.0 
    svn/trunk 

Chính xác những gì tôi cần. Cảm ơn vì cái nhìn sâu sắc, tất cả.

+0

+1 cho tùy chọn nhân bản sâu – VonC

13

Bạn có thể thử nirvdrum's svn2git (có vẻ là cập nhật nhất) để nhập svn của bạn vào kho lưu trữ git không?
(Đầu năm 2009, Paul nêu iteman's svn2git thay thế original jcoglan's svn2git này, đó là, như tác giả của ông đề cập điều này: "một cách nhanh chóng hack để lấy mã của tôi ra của Subversion")

Nó là tốt hơn so với git svn clone vì nếu bạn có mã này trong svn:

trunk 
    ... 
    branches 
    1.x 
    2.x 
    tags 
    1.0.0 
    1.0.1 
    1.0.2 
    1.1.0 
    2.0.0 

git-svn sẽ đi qua lịch sử cam kết xây dựng một repo git mới.
sẽ nhập tất cả các chi nhánh và thẻ làm chi nhánh svn từ xa, trong khi những gì bạn thực sự muốn là các chi nhánh địa phương git và các đối tượng thẻ git.
Vì vậy, sau khi nhập dự án này, bạn sẽ nhận được:

$ git branch 
    * master 
    $ git branch -a 
    * master 
    1.x 
    2.x 
    tags/1.0.0 
    tags/1.0.1 
    tags/1.0.2 
    tags/1.1.0 
    tags/2.0.0 
    trunk 
    $ git tag -l 
    [ empty ] 

Sau svn2git được thực hiện với dự án của bạn, bạn sẽ có được điều này thay vì:

$ git branch 
    * master 
    1.x 
    2.x 
    $ git tag -l 
    1.0.0 
    1.0.1 
    1.0.2 
    1.1.0 
    2.0.0 

Tất nhiên, giải pháp này là không có nghĩa là chuyến đi một chiều.

Bạn luôn có thể quay lại kho lưu trữ svn của mình, với ...git2svn (còn present there)

Ý tưởng vẫn còn:

  • SVN tại nơi làm việc như một kho lưu trữ trung ương.

  • Git "ở nơi khác" để thử nghiệm nhanh chóng giữa nhiều nhánh Git-tư nhân.

  • nhập khẩu trở lại chỉ củng cố các chi nhánh Git thành các chi nhánh chính thức SVN.

+0

Tôi thấy nhận xét này trên một bài đăng khác tương tự như vấn đề của tôi. Thật không may, tôi không nghĩ rằng điều này sẽ làm việc (mặc dù tôi chắc chắn sẽ xem xét kỹ hơn về svn2git). Tôi cần phải tương tác trực tiếp với repo Svn. Có những thành viên khác trong đội chưa sẵn sàng cho Git. –

+0

+1 - Tôi đã có một vấn đề tương tự khi tôi đã học git, cho đến khi tôi thiết lập một repo mới bằng cách sử dụng svn2git và các vấn đề đã biến mất. Một phiên bản cập nhật hơn có sẵn tại http://github.com/iteman/svn2git/tree/master. – Paul

+0

@VonC - Cách khởi động lại bản sao nếu nó bị gián đoạn do không có mạng? – notionquest

9

Đối với bố trí repo không phục vụ bởi các kí hiệu đơn giản: (my answer-this related question)

Các current git-svn manpage nói:

Cũng có thể lấy một tập dữ chi nhánh hoặc thẻ bằng cách sử dụng một danh sách các tên được phân cách bằng dấu phẩy trong phạm vi niềng răng. Ví dụ:

[svn-remote "huge-project"] 
    url = http://server.org/svn 
    fetch = trunk/src:refs/remotes/trunk 
    branches = branches/{red,green}/src:refs/remotes/branches/* 
    tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 
+0

Tôi đã làm theo các bước của bạn và có 1 thẻ được di chuyển. Tôi muốn lặp lại tương tự cho một vài thẻ tiếp theo. Tôi đã cố gắng thêm thẻ thứ ba {1.0,2.0, 3.0} và thực hiện tìm kiếm git svn. Nhưng nó không lấy bất cứ thứ gì từ repo. Tôi có thiếu gì không? – notionquest

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