it-swarm-vi.tech

Cam kết một phần với lật đổ

Với trường hợp tôi đã thực hiện hai thay đổi độc lập trong tệp one: vd. đã thêm một phương thức mới và thay đổi một phương thức khác.

Tôi thường không muốn cam kết cả hai thay đổi là cam kết một, nhưng là cam kết độc lập hai.

Trên kho git, tôi sẽ sử dụng Chế độ tương tác của git-add (1) để chia hunk thành các phần nhỏ hơn:

 git add --patch

Cách dễ nhất để làm điều này với Subversion là gì? (Thậm chí có thể sử dụng một trình cắm thêm Eclipse)

Cập nhật:
Trong Điều quan trọng về Git , Ryan gọi nó là: khăn Vấn đề sao chép làm việc rối rắm. [

96
Benedikt Waldvogel

Với git-svn, bạn có thể tạo kho lưu trữ GIT cục bộ của kho SVN từ xa, làm việc với nó bằng bộ tính năng GIT đầy đủ (bao gồm các cam kết một phần) và sau đó Đẩy tất cả trở lại kho lưu trữ SVN.

git-svn (1)

32
jkramer

Rùa SVN 1.8 hiện hỗ trợ tính năng này với tính năng "Khôi phục sau khi cam kết". Điều này cho phép bạn chỉnh sửa tệp, với tất cả các chỉnh sửa được hoàn tác sau khi cam kết

Theo tài liệu:

Để chỉ cam kết các phần của tệp liên quan đến một vấn đề cụ thể:

  1. trong hộp thoại cam kết, nhấp chuột phải vào tệp, chọn "khôi phục sau khi xác nhận"
  2. chỉnh sửa tệp trong ví dụ: TortoiseMerge: hoàn tác các thay đổi mà bạn chưa muốn cam kết
  3. lưu các tập tin
  4. cam kết tập tin
58
Casebash

Tôi đã thực hiện điều này bằng cách sử dụng TortoiseSVN .

Tiện ích hợp nhất tích hợp cho phép bạn hiển thị khác biệt giữa phiên bản kho lưu trữ và bản sao làm việc của bạn.

Sử dụng hàm tạo bản sao lưu của tiện ích diff

  1. Đi đến cam kết tệp của bạn như thể bạn sẽ cam kết tất cả các thay đổi của bạn.
  2. Trong cửa sổ cam kết, nhấp đúp vào tệp để hiển thị khác.
  3. Trong cài đặt khác, nhấp vào tùy chọn để sao lưu tệp gốc
  4. Nhấp chuột phải vào các thay đổi bạn không muốn và sử dụng select sử dụng khối văn bản khác.
  5. Lưu khác biệt chính xác một lần. Bản sao lưu sẽ được ghi đè mỗi khi bạn lưu. Đây là lý do tại sao bạn chỉ muốn lưu một lần.
  6. Cam kết thay đổi.
  7. Ghi đè bản gốc bằng tệp .bak đã tạo (sẽ có tất cả các thay đổi ban đầu của bạn).
  8. Cam kết tập tin của bạn.

Bây giờ bạn sẽ có tất cả các thay đổi đã cam kết, sử dụng hai cam kết riêng biệt.

42
Spike

Hãy thử sử dụng svn diff > out.patch sau đó sao chép tệp out.patch sang out.patch.addout.patch.modify 

Chỉ khi bạn có tệp vá hoạt động hoàn nguyên tệp gốc bằng cách sử dụng svn revert out.c.

Chỉnh sửa các tệp vá bằng tay để chúng chỉ chứa hunks để thêm hoặc sửa đổi. Áp dụng chúng cho tệp gốc bằng lệnh patch, kiểm tra xem phần bổ sung có hoạt động không, sau đó svn commit bổ sung.

Rửa lặp lại rửa cho miếng vá out.patch.modify.

Nếu các thay đổi là riêng biệt trong tệp như câu hỏi ban đầu của bạn đã nêu - đã thêm một phương thức mới, đã thay đổi một phương thức hiện có - điều này sẽ hoạt động

Đây là một giải pháp rất tẻ nhạt - mặc dù tôi không tin bạn nên có bất kỳ lý do nào để tách các cam kết của bạn.

Bạn cũng có thể đã kiểm tra nhiều bản sao làm việc của cùng một nguồn để áp dụng công việc của mình:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Hãy chắc chắn svn up và kiểm tra để đảm bảo tất cả đều ổn.

25
Chris

Điều này có thể sử dụng TortoiseSvn (Windows) kể từ v1.8.

4.4.1. Hộp thoại Cam kết

Nếu bản sao làm việc của bạn được cập nhật và không có xung đột, bạn đã sẵn sàng để thực hiện các thay đổi của mình. Chọn bất kỳ tệp và/hoặc thư mục bạn muốn cam kết, sau đó TortoiseSVN → Cam kết ....

<snip>

4.4.3. Chỉ cam kết các phần của tệp

Đôi khi bạn chỉ muốn cam kết một phần các thay đổi bạn đã thực hiện đối với tệp. Tình huống như vậy thường xảy ra khi bạn đang làm việc gì đó nhưng sau đó cần sửa chữa khẩn cấp được cam kết và sửa lỗi đó xảy ra trong cùng một tệp bạn làm việc trên. 

nhấp chuột phải vào tệp và sử dụng Trình đơn ngữ cảnh → Khôi phục sau khi xác nhận . Điều này sẽ tạo ra một bản sao của tập tin như nó là. Sau đó, bạn có thể chỉnh sửa tệp, ví dụ: trong TortoiseMerge và hoàn tác tất cả các thay đổi bạn không muốn cam kết. Sau khi lưu những thay đổi đó, bạn có thể cam kết tập tin. 

Sau khi cam kết được thực hiện, bản sao của tệp được khôi phục tự động và bạn có tệp với tất cả các sửa đổi của mình đã không cam kết trở lại.

Trên Linux, tôi sẽ cung cấp http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php thử. Mặc dù vậy, tôi đã không thử nó.

10
parvus

Tôi đã từng làm điều này:

  • Trong trình chỉnh sửa của tôi (tôi sử dụng vim), hãy chỉnh sửa tệp để chỉ một trong những thay đổi xuất hiện
  • Lưu tệp (nhưng không thoát khỏi trình chỉnh sửa)
  • Cam kết thay đổi tập tin thành svn
  • Nhấn "hoàn tác" trong trình chỉnh sửa đủ lần cho lần thay đổi thứ hai xuất hiện lại
  • Lưu lại tập tin
  • Cam kết bộ thay đổi thứ hai.

Đây là một cách tiếp cận đơn giản, giả sử một bộ thay đổi là hoàn toàn dễ dàng để hoàn tác. Đối với các tình huống phức tạp hơn, tôi sẽ từ bỏ và cam kết cả hai thay đổi mà không phải lo lắng về nó.

Bây giờ tôi sử dụng git, đây là điều tôi hy vọng tôi sẽ không bao giờ phải làm lại!

8
Greg Hewgill

Tôi sử dụng hoặc một repar darcs địa phương, hoặc chỉ hợp nhất các thay đổi dần dần. Với việc hợp nhất (opendiff mở FileMerge, một chương trình hợp nhất đi kèm với Xcode; thay thế bằng công cụ hợp nhất yêu thích của bạn):

cp file file.new
svn revert file
opendiff file.new file -merge file

hợp nhất các thay đổi liên quan, lưu hợp nhất, thoát khỏi chương trình hợp nhất

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

nếu có nhiều hơn một hunk không liên quan trong tệp, rửa sạch và lặp lại (nhưng tại sao bạn lại đợi quá lâu trước khi cam kết?!)

Ngoài ra, nếu bạn biết git, bạn có thể sử dụng git-svn để duy trì repo git cục bộ và đồng bộ hóa cam kết của bạn với máy chủ chính svn; làm việc tuyệt vời trong kinh nghiệm hạn chế của tôi.

5
Aeon

Hãy thử VisualSVN cho Visual Studio . Bản phát hành 6.1 mới nhất giới thiệu tính năng QuickCommit. Bạn có thể cam kết một phần các thay đổi đã chọn trong một tệp bằng cách sử dụng các lệnh trình đơn ngữ cảnh Commit this BlockCommit Selection trong trình soạn thảo Visual Studio.

 enter image description here

3
bahrep
  1. Mở tất cả các tệp bạn muốn tách trong trình soạn thảo lựa chọn
  2. Sử dụng bộ công cụ khác (trên Win, sử dụng đề xuất của Spike (phiên bản cũ)) sao lưu bộ thứ hai
  3. Cam kết
  4. quay lại lựa chọn biên tập của bạn và lưu tất cả các tệp

Đó là một chút rủi ro hơn đề xuất đầy đủ của Spike nhưng có thể dễ dàng thực hiện hơn. Ngoài ra, hãy đảm bảo bạn thử nó trên một cái gì khác trước vì một số biên tập viên sẽ từ chối lưu vào một tệp đã bị thay đổi từ bên dưới trừ khi bạn tải lại tệp đó (mất tất cả các thay đổi của bạn)

2
BCS

Tôi nghĩ rằng một tùy chọn dễ dàng hơn so với việc tạo các tệp diff, hoàn nguyên, v.v., sẽ có hai bản sao của kho lưu trữ được kiểm tra và sử dụng một công cụ tìm khác biệt như DeltaWalker để sao chép các khối từ người này sang người khác.

Bản sao đầu tiên sẽ là bản sao bạn thực sự làm việc và bản thứ hai sẽ dành cho mục đích này. Khi bạn đã thực hiện rất nhiều thay đổi cho phần đầu tiên, bạn có thể sao chép một phần sang phần thứ hai, cam kết, sao chép phần khác, cam kết, v.v.

0
Ian Dunn
  1. Sao chép tất cả các tập tin sửa đổi liên quan đến bản sao lưu.
  2. Tạo một bản vá của trạng thái làm việc bằng cách sử dụng svn diff.
  3. Hoàn nguyên các tệp bằng cách sử dụng svn revert.
  4. Áp dụng lại các phần của bản vá mà bạn muốn cam kết, bằng cách sử dụng công cụ patch hoặc bằng cách chỉnh sửa thủ công hoặc bất cứ điều gì.
  5. Chạy diff sau đó để so sánh bản sao làm việc của bạn với bản sao lưu để đảm bảo bạn đã áp dụng các phần vá chính xác.
  6. Xây dựng và thử nghiệm.
  7. Cam kết.
  8. Sao chép các bản sao lưu của bạn trở lại kiểm tra kho lưu trữ của bạn.
  9. Lặp lại ở 2. (không phải 1.!) Cho đến khi hoàn thành.
0
michaeljt