2010-03-22 29 views
51

Sau khi sao chép kho SVN bằng git-svn với tùy chọn -s (git svn clone http://server/repo -s), cách tạo một chi nhánh hoặc thẻ và đã đẩy đến thư mục chi nhánh/thẻ có liên quan trong kho lưu trữ khi dcommit nhập?Git-svn: tạo và đẩy chi nhánh/thẻ mới?

Ví dụ; nếu tôi sử dụng git để tạo chi nhánh foobar tại địa phương (git checkout -b foobar) làm cách nào tôi có thể có git-svn tạo chi nhánh trên máy chủ (http://server/repo/branches/foobar)?

Tôi đang sử dụng Git 1.5.5.6.


Xin lưu ý:

Phương pháp được chấp nhận dưới đây không làm việc với Git 1.5.5.6 như không có phương pháp git svn branch. Tôi vẫn đang tìm kiếm một giải pháp cho điều này mà không liên quan đến việc giải quyết để làm việc với svn trực tiếp.

Trả lời

71

Bạn có thể đọc tất cả các chi tiết thực dụng trong tutorial này, nhưng thực chất là cơ bản như sau:

$ git svn branch -m "Topic branch" my_topic   # Create SVN branch called "my_topic" 
$ git checkout --track -b my-topic remotes/my_topic # Create the Git branch for "my_topic" 
# Hack hack hack... 
$ git svn dcommit --dry-run # Make sure you're committing to the right SVN branch 
$ git svn dcommit    # Commit changes to "my_topic" branch in SVN 
+0

Điều này ** không ** làm việc với phiên bản git 1.5.5.6 của tôi - không có lệnh như vậy "git svn branch'. –

+9

'git svn branch' đã được thêm vào trong v1.6.1. Tôi khuyên bạn nên nâng cấp, vì 1.5.5.6 là khoảng một năm rưỡi. – mipadi

+0

cách sử dụng thẻ với thẻ svn. Tôi tạo thẻ svn với mô tả thẻ 'git svn tag -m '" 0.0.2'. Và bây giờ tôi muốn đặt thẻ thích hợp trong git. Làm thế nào tôi nên làm điều này? Cảm ơn – yas375

0

Tôi chỉ muốn chỉ ra rằng bạn không nên rebase vào chi nhánh mới thành lập từ những thứ bạn đã có trong một nhánh git khác. git svn dcommit sau đó sẽ đẩy nó về phía sau. Ít nhất đó là một vấn đề đối với tôi.

Thay vào đó, nếu bạn muốn kéo các thay đổi từ nhánh git cũ sang nhánh svn mới này, hãy sử dụng ví dụ: cherry-pick.

+0

Tôi chỉ cố gắng này (hợp nhất old_branch vào new_svn_branch, sau đó dcommit) và nó cam kết chính xác SVN chi nhánh (không thân cây). Sử dụng msysgit 1.7.9. – florisla

+0

Ý tôi là nếu bạn có branch1 và branch2 trong git, muốn tạo branch1 mới trong svn, và sau đó trong git branch1 rebase từ branch2. dcommitting sau đó sẽ đi đến thân cây (đã làm cho tôi). Có thể là với đề xuất của @ pestrella, đây không phải là vấn đề. Và trong bất kỳ trường hợp nào, nó cũng là một phần nhỏ. – yngve

48

Nếu bạn đã tạo chi nhánh địa phương của bạn trước khi chi nhánh lật đổ tồn tại và bây giờ bạn muốn đẩy chi nhánh địa phương của bạn thành một chi nhánh lật đổ, bạn có thể thực hiện như sau:

Tạo chi nhánh svn từ phiên bản mà bạn đã tạo của bạn chi nhánh địa phương

 
    $ svn cp http://svn-repo/my_app/[email protected] http://svn-repo/my_app/branches/feature1 

Fetch chi nhánh svn mới để repo git của bạn biết về nó

 
    $ git svn fetch 

nhánh svn nên bây giờ được thêm dưới dạng điều khiển từ xa trong git repo của bạn

 
    $ git branch -a 
    * feature1 
     master 
     remotes/feature1 

Tại thời điểm này, điều khiển từ xa của bạn sẽ vẫn còn nguyên. Bạn cần trỏ nhánh địa phương của bạn đến nhánh mới từ xa. Bạn có thể làm điều này bằng rebasing chi nhánh địa phương của bạn từ chi nhánh từ xa:

 
    $ git rebase remotes/feature1 

Bây giờ chi nhánh địa phương của bạn đề cập đến chi nhánh ở xa, bạn có thể cam kết thay đổi của bạn lên đó.Đầu tiên làm một chạy khô, do đó bạn tự tin rằng những thay đổi của bạn sẽ đi vào chi nhánh từ xa của bạn:

 
    $ git svn dcommit --dry-run 
    Commiting to http://svn-repo/my_app/branches/feature1 

Bây giờ bạn có thể cam kết những thay đổi chi nhánh từ xa của bạn

 
    $ git svn dcommit 

thế nào-tos Hầu hết sẽ cho bạn biết để subversion chi nhánh đầu tiên và sau đó tạo ra một chi nhánh địa phương theo dõi các chi nhánh từ xa. Nhưng tôi thường không quyết định trước khi chi nhánh địa phương của tôi nên theo dõi một chi nhánh từ xa. Thường thì tôi chi nhánh tại địa phương, và thực hiện các thay đổi mà không có ý định đẩy đến một nhánh từ xa. Nếu sau đó tôi quyết định cam kết chi nhánh địa phương của mình vào chi nhánh từ xa, tôi thực hiện các bước trên.

+1

Tuyệt vời! Chính xác! –

+2

@unpluggd: Tôi nghĩ rằng đây phải là câu trả lời được chấp nhận bởi vì nó thực sự trả lời câu hỏi được hỏi. Tức là, trừ khi câu trả lời được chấp nhận giả định một nhánh địa phương đã được tạo và tấn công trước khi gõ các lệnh đó. –

+0

Tôi không thấy chi nhánh mới khi chạy 'git svn fetch' – SnapDragon

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