2009-06-10 31 views
9

Tôi có một số bản vá lỗi được cam kết cục bộ trong repo git-svn mà tôi chưa cam kết với repo svn của chúng tôi. Một "git svn dcommit" bình thường sẽ cam kết tất cả các bản vá lỗi này vào svn. Tôi muốn cam kết chỉ một số bản vá lỗi của tôi (sửa lỗi đơn giản), nhưng không phải một số bản vá khác (những thay đổi lớn chưa được kiểm tra). Làm thế nào tôi có thể làm điều này với git svn?Làm thế nào để chỉ chấp nhận các bản vá được chọn với git svn?

Trả lời

5

Đây là những gì tôi đã kết thúc. Điểm bắt đầu là nhánh "master" được đồng bộ hóa với svn, với tất cả các bản vá cục bộ của tôi ở trên cùng.

  1. Tạo nhánh mới (wip = Work In Progress).

    git branch wip 
    

    Điều này tạo bản sao của nhánh hiện tại, bao gồm tất cả các bản vá chưa được cam kết với svn. Chi nhánh hiện tại sẽ ở trạng thái "chính" và sẽ không bị thay đổi.

  2. Hủy bỏ các bản vá lỗi địa phương không mong muốn từ "bậc thầy" với một rebase:

    git rebase -i HEAD~10 
    
  3. Bây giờ "master" chi nhánh có các bản vá lỗi, bạn có thể an toàn cam kết:

    git svn dcommit 
    

    Các "WIP" nhánh bây giờ có những thay đổi lớn chưa sẵn sàng để chia sẻ. Thực ra, tôi muốn họ ở lại đó và đây là nơi tôi sẽ dừng lại. Có thể thực hiện svn dcommit từ nhánh "wip" sau khi mọi thứ được hoàn thành. Nhưng để hoàn thành, và để trả lời câu hỏi ban đầu, có một bước cuối cùng:

  4. Kéo các thay đổi không được cam kết về chi nhánh "master" bằng cách sử dụng git cherry-pick và cuối cùng loại bỏ nhánh vô dụng với git branch -d wip.

+0

Bước cuối cùng ở đây là "git pull. Wip" chỉ kéo tất cả các thay đổi từ nhánh wip, để thỏa mãn câu hỏi ban đầu, bạn cần sử dụng git-cherry-pick. –

+0

Đánh dấu, cảm ơn bạn đã chỉ ra điều đó; Tôi đã chỉnh sửa bài đăng để sử dụng lựa chọn anh đào thay thế. Sử dụng "git pull. Wip" theo sau là "git svn rebase" thường sẽ tự động giải quyết xung đột, nhưng tốt hơn nên sử dụng lựa chọn cherry. –

2

Với git, bạn không thực sự phải hoạt động trên các thay đổi đơn lẻ. Cách tiếp cận tốt nhất tôi biết là tạo ra các chi nhánh địa phương cho bất kỳ công việc không tầm thường nào. Bằng cách này, những thay đổi lớn chưa được kiểm tra của bạn sẽ kết thúc ở các nhánh khác nhau của kho lưu trữ git của bạn, và bạn sẽ có thể phân biệt chúng khá dễ dàng.

Nếu đây là vấn đề bạn có lúc này, bạn có thể tạo chi nhánh mới từ điểm bạn cập nhật lần cuối từ svn và sau đó sử dụng git-cherry-pick để chuyển các bản sửa lỗi đơn giản cho nhánh mới này, từ đó bạn có thể dcommit để svn.

Từ quan điểm dài hạn hơn về quan điểm đó là tốt nhất để có riêng của "bậc thầy" chi nhánh của bạn được làm từ thân cây lật đổ, và sau đó một trong hai:

  1. rebase tất cả các chi nhánh của bạn mỗi khi bạn cập nhật từ svn, sau đó hợp nhất những người bạn muốn nhận được để svn để chủ của bạn và dcommit từ đó.
  2. Hợp nhất nội dung từ svn bằng cách sử dụng thông thường git-merge và sau đó hợp nhất nội dung với tổng thể của bạn cho các thông báo theo git diff ..my_branch | patch -p1, điều này sẽ loại bỏ lịch sử mà git-svn không thể xử lý. Cách tiếp cận này phức tạp hơn cho việc hợp nhất cuối cùng nhưng cho phép bạn kết hợp các công cụ giữa các nhánh (và có thể cả những người khác) trong chính git.
Các vấn đề liên quan