2012-04-19 27 views
16

Câu hỏi ngắn: git-svn tương đương với svn up -r r1130 để chỉ cập nhật cho cam kết được đánh số (với số svn) là gì?Tôi có thể git svn rebase để sửa đổi svn nhất định không? (Tương tự như svn up -r ...)

Tôi đang sử dụng git-svn để tôi có thể sử dụng cả git và quản lý (nhiều) chi nhánh cục bộ của kho lưu trữ svn của nhóm của tôi. Tôi có một phiên bản của phần mềm mà tôi hack lên để làm việc với một thiết lập phần cứng cụ thể. Kể từ lần cuối cùng tôi làm việc với nó, repo svn đã di chuyển về phía trước qua một điểm ổn định, tốt cho công việc này. Tôi muốn cập nhật các chi nhánh địa phương để một phiên bản đánh số đại diện cho cam kết ổn định. Tôi có thể làm điều này trong svn với svn up -r r1130, nhưng tôi thích git.

Tôi quên mất cách tôi đã thực hiện việc này trong quá khứ và tự tìm kiếm SO và các trang trợ giúp tìm cách tốt nhất. Có lẽ có một từ khác nhau Q & A mà tôi đang thiếu? Nó là dễ dàng, đủ để chỉ cần kiểm tra các sửa đổi cũ trên một cây sạch, nhưng khi tôi mang cam kết trên đầu trang của cây, "tua đầu để phát lại công việc của bạn trên đầu trang của nó ..." một phần mà Tôi thường yêu có nghĩa là tôi sẽ đi đến một điểm trên cây trước khi những thay đổi của tôi được thêm vào!

Hiện tại, tôi sẽ git svn rebase và sau đó rebase tương tác để quay lại các cam kết tôi không muốn, nhưng tôi đang gặp khó khăn khi tin rằng đây là cách tốt nhất hoặc thậm chí là tốt.

Trả lời

18

Tôi thích rebase vì git-svn sẽ phải thực hiện lại các thay đổi của bạn trước dcommit. Hãy thử điều này thay vì:

git checkout `git svn find-rev r1241` # Go to the svn version of interest 
git checkout -b master_r1241   # Create a new brach matching it 
git checkout hwTesting     # Merge previously created changes 
git rebase master_r1241    # rebase on top of not quite up-to-date master branch 

Bạn có thể làm điều này trong một bước cũng: (luôn luôn có thể trở lại sử dụng reflog hoặc rebase --abort nếu mọi thứ đi sai lầm khủng khiếp).

git checkout hwTesting     # Checkout feature branch 
git rebase `git svn find-rev r1241` # rebase on top of not quite up-to-date master branch 
+0

Cuối cùng tôi đã có cơ hội để thử điều này và phiên bản một bước của điều này là chính xác những gì tôi đang tìm kiếm. Cảm ơn! – sage

1

Dường như không có cách nào để làm điều đó trong một bước. Tuy nhiên, bạn có thể dễ dàng tìm thấy id cam kết git tương ứng cho một số sửa đổi svn đã cho. Hãy thử điều này:

git svn find-rev rN 

trong đó N là số sửa đổi bạn muốn. Sau đó, sử dụng git checkout để kiểm tra điểm cụ thể đó trong lịch sử.

+0

Đây là một lệnh hữu ích thường hữu ích, nhưng nếu tôi ở chi nhánh có cam kết mới và tôi 'git svn rebase' nhánh đó, thì nó sẽ phát lại các cam kết mới của tôi ở đầu cam kết svn trong câu hỏi. Lệnh của bạn sẽ kiểm tra xác nhận * không sửa đổi * svn, tức là không có thay đổi của tôi được cam kết ở trên cùng. Có lẽ tôi có thể làm điều này, sau đó tạo một chi nhánh mới tại thời điểm đó, và cuối cùng hợp nhất chi nhánh mới này vào chi nhánh tính năng của tôi? – sage

+0

Điểm tốt ... Tôi nghĩ rằng thói quen tôi có xu hướng git svn rebase trên các chi nhánh theo dõi ...theo cách đó, các nhánh tính năng của tôi bị ảnh hưởng cho đến khi chúng sẵn sàng để được tích hợp với đường chính. Tôi đã đặt câu hỏi của bạn để hỏi làm thế nào để cập nhật và THEN di chuyển đến một phiên bản cụ thể trong các cam kết mới. –

0

Tôi sẽ để nguyên tham chiếu này vì câu trả lời được chấp nhận đề cập đến nó. Sử dụng tùy chọn rebase một lớp, mặc dù ...


Đây là những gì tôi đang làm bây giờ. Lần này tôi đang nâng cấp từ r1130 (được đề cập trong câu hỏi) để r1241:

git checkout `git svn find-rev r1241` # Go to the svn version of interest 
git checkout -b hwTesting_r1241  # Create a new brach matching it 
git merge hwTesting_r1130    # Merge previously created changes 

này chủ yếu mang lại cho tôi những gì tôi muốn, nhưng nó sinh ra một chi nhánh khác mỗi khi tôi cập nhật. Có vẻ như phải có cách nào đó để nói với git chỉ hợp nhất các cam kết trên tổng thể và bao gồm cả cam kết trả về bởi git svn find-rev r1241.

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