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
Đâ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.
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.
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
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:
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ớigit branch -d wip
.
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:
- 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ừ đó.
- 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.
Tôi đã làm theo các thủ tục ở đây:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
Nếu bạn rebasing thoải mái, nó hoạt động khá tốt.
- 1. Làm thế nào để đánh lừa git-svn để nhận ra các hợp nhất được thực hiện với svn?
- 2. Tôi có thể nhận được đầu ra tương thích với bản vá từ git-diff không?
- 3. áp dụng bản vá svn cho kho git
- 4. Làm cách nào để sửa đổi đường dẫn tệp trong tập hợp các bản vá Git?
- 5. Làm thế nào để áp dụng bản vá `git diff` mà không cần cài đặt Git?
- 6. Làm thế nào để tạo và áp dụng bản vá SVN?
- 7. Làm thế nào để git quyết định phiên bản nào của svn để sử dụng trong git-svn?
- 8. Tại sao bản vá từ chối tệp vá của tôi trên bản sao làm việc SVN?
- 9. Làm thế nào bạn có thể sử dụng git-svn để sao chép các phần của repo SVN, nhưng vẫn nhận được tất cả các nhánh
- 10. Nhận bản vá có thể áp dụng sau khi thực hiện svn remove và svn rename
- 11. Làm thế nào để áp dụng một bản vá cũ trong Git?
- 12. Làm thế nào để làm cho một TextBox chỉ chấp nhận các ký tự chữ cái?
- 13. Có cách nào để git tạo bản vá cho bảng đánh giá không?
- 14. Làm thế nào để kết thúc dòng lệnh git-svn?
- 15. netrc không được chấp nhận bởi git
- 16. Làm thế nào để áp dụng SVN diff to Git?
- 17. Làm cách nào để áp dụng bản vá được tạo bằng git format-patch?
- 18. Chuyển đổi svn thành git, làm thế nào để có được các chi nhánh không được chỉ từ xa trong repo svn?
- 19. git: bản vá không áp dụng
- 20. Làm thế nào để làm cho tập tin sản xuất svn diff vá lỗi sẽ áp dụng, khi svn cp hoặc svn mv đã được sử dụng?
- 21. Làm thế nào để tạo bản vá giữa hai thẻ với nhiều cam kết giữa chúng?
- 22. Ứng dụng email được khuyến nghị để đọc/áp dụng các bản vá git?
- 23. Làm thế nào để ngăn chặn git svn rebase để tạo ra các thư mục rỗng
- 24. Không được chấp nhận: Chức năng tách() không được chấp nhận. Làm thế nào để sửa lỗi này?
- 25. Có thực hành chấp nhận được để vá các lớp cơ sở của Ruby, chẳng hạn như Fixnum?
- 26. Làm thế nào để bạn squash cam kết thành một bản vá với git định dạng-patch?
- 27. Đóng góp các bản vá lỗi từ Mercurial cho Git?
- 28. Git: hook email sau khi nhận, bao gồm các bản vá lỗi khác?
- 29. Làm thế nào bạn có thể chỉ ra các tập tin để bỏ qua trong svn khi sử dụng git và git-svn bridge?
- 30. Có cách nào để "git svn dcommit" từ một kho git-svn nhân bản:
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. –
Đá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. –