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


104

Trong trường hợp, tôi đã thực hiện hai thay đổi độc lập trong một tệp: ví dụ: đã 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 như một cam kết, mà là hai cam kết độc lập.

Trên một kho git tôi sẽ sử dụng chế độ tương tác của git-add (1) để phân chia các hunk vào những cái 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 trình cắm thêm Eclipse)

Cập nhật:
Trong The Thing About Git , Ryan gọi nó là: “Vấn đề sao chép làm việc rối.”


Bạn có đang tìm kiếm giải pháp cụ thể trên dòng lệnh không? Nhiều câu trả lời bên dưới đề cập đến TortoiseSVN 'khôi phục sau khi cam kết', là một tính năng chỉ dành cho Tortoise - dựa trên GUI và Windows.
florisla

Câu trả lời:


35

Với git-svn, bạn có thể tạo một kho lưu trữ GIT cục bộ của kho lưu trữ SVN từ xa, làm việc với nó bằng cách sử dụng bộ tính năng GIT đầy đủ (bao gồm 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)


25
Có một điều trớ trêu đặc biệt trong giải pháp này.
tuxayo

65

Tortoise SVN 1.8 hiện hỗ trợ điều 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 thực hiện các chỉnh sửa đối với một tệp, với tất cả các chỉnh sửa sẽ đượ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 cam kết"
  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 thực hiện
  3. lưu các tập tin
  4. cam kết tập tin

Tôi tự hỏi làm thế nào điều này hoạt động. Tôi đã kiểm tra các ghi chú phát hành SVN 1.8 , nhưng tôi không thể tìm ra tính năng "Khôi phục sau khi cam kết" dựa trên tính năng nào.
DavidS

3
@DavidS Đây không phải là một tính năng của SVN. Đó là một tính năng của TortoiseSVN.
florisla

FYI, SVN 1.8 là EOL từ tháng 4 năm 2018 với việc phát hành 1.10
Greg K

Chúng tôi cũng có thể tìm thấy nó trong tài liệu ở đây: rùa
bò (

42

Tôi đã thực hiện việc này bằng TortoiseSVN .

Tiện ích hợp nhất được tích hợp sẵn cho phép bạn hiển thị sự 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 chức năng tạo sao lưu của tiện ích khác

  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 mình.
  2. Trong cửa sổ cam kết, nhấp đúp vào tệp để hiển thị sự khác biệt.
  3. Trong cài đặt khác biệt, hãy nhấp vào tùy chọn để sao lưu tệp gốc .
  4. Bấm chuột phải vào những thay đổi bạn không muốn và sử dụng chọn 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 tiết kiệm 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 của bạn.

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


1
Chính xác thì bạn đã làm điều này như thế nào? Tôi muốn học kỹ thuật đó.
Lasse V. Karlsen

Sẽ rất gọn gàng nếu điều này sẽ tự động ghi đè lên các tệp .bak sau khi cam kết.
BCS

Tôi không tìm thấy các bước 3: Tùy chọn sao lưu, sử dụng SVN Rùa 1.8.1
sudhAnsu63

4
Đừng bận tâm. Đã tìm thấy liên kết cốt lõi cho 1.8 rùa cạnvn.net/tsvn_1.8_releasenotes.html Để chỉ cam kết các phần của tệp liên quan đến một vấn đề cụ thể: 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 cam kết" chỉnh sửa tệp trong ví dụ TortoiseMerge: undo các thay đổi mà bạn không muốn cam kết chưa lưu các tập tin cam kết tập tin
sudhAnsu63

Đáng buồn thay, điều này dường như không khả dụng trong phiên bản 1.8.5 của Tortoise, cũng như "khôi phục sau khi cam kết".
kajaco

24

Hãy thử sử dụng, svn diff > out.patchsau đó sao chép out.patchtệp vào out.patch.addout.patch.modify

Chỉ khi bạn có một tệp bản vá đang hoạt động, hãy 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 tin vá bằng tay để họ chỉ chứa hunks cho thêm hoặc sửa đổi. Áp dụng chúng vào tệp gốc bằng patchlệnh, kiểm tra xem phép bổ sung có hoạt động hay không, sau đó svn commitlà phép bổ sung.

Rửa sạch lặp lại cho out.patch.modifymiếng dán.

Nếu các thay đổi 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 pháp 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 rằng bạn nên có bất kỳ lý do gì để tách các cam kết của mình.

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

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

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


11

Điều này có thể thực hiện được bằ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 nào bạn muốn cam kết, sau đó chọn TortoiseSVN → Cam kết ....

<snip>

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

Đôi khi bạn muốn chỉ cam kết các phần của những 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 phải cam kết một bản sửa lỗi khẩn cấp và bản sửa lỗi đó xảy ra trong cùng một tệp bạn đang làm việc.

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 cam kết. Thao tác này sẽ tạo một bản sao của tệp như nó vốn có. Sau đó, bạn có thể chỉnh sửa tệp, ví dụ như trong TortoiseMerge và hoàn tác tất cả các thay đổi bạn không muốn thực hiện. Sau khi lưu những thay đổi đó, bạn có thể cam kết tệp.

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

Trên Linux, tôi sẽ dùng thử http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php . Tuy nhiên, tôi vẫn chưa thử nó.


8

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 các 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 tệp đã thay đổi thành svn
  • Nhấn "hoàn tác" trong trình chỉnh sửa đủ lần để tập hợp các thay đổi thứ hai xuất hiện lại
  • Lưu tệp lại
  • Cam kết tập hợp các thay đổi thứ hai.

Đây là một cách tiếp cận đơn giản giả định rằng một tập hợp các thay đổi có thể dễ dàng hoàn tác một cách hợp lý. Đối với những tình huống phức tạp hơn, tôi sẽ từ bỏ và thực hiện cả hai thay đổi mà không cần 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!


4

Tôi sử dụng repo darcs cục bộ hoặc chỉ hợp nhất các thay đổi trong dần dần. Với 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 tệp tin không liên quan trong tệp, hãy rửa sạch và lặp lại (nhưng tại sao bạn phải đợi quá lâu trước khi thực hiện ?!)

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


9
Re: "Sao đợi lâu vậy?" Bạn đang thực hiện một công việc tái cấu trúc lớn cả ngày và ông chủ đưa ra một bản sửa lỗi nhỏ-này-bây giờ ngay trước bữa trưa.
BCS

4

Hãy thử VisualSVN cho Visual Studio . Phiên bản 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 tệp bằng cách sử dụng lệnh menu ngữ cảnh Cam kết khối nàyLựa chọn cam kết mới trong trình chỉnh sửa Visual Studio.

nhập mô tả hình ảnh ở đây


2
  1. Mở tất cả các tệp bạn muốn tách trong trình biên tập tùy chọn
  2. Sử dụng một bộ công cụ khác (trên Win, sử dụng gợi ý của Spike (phiên bản cũ)) lùi bộ thứ hai
  3. Cam kết
  4. quay lại trình chỉnh sửa bạn chọn và lưu tất cả các tệp

Nó rủi ro hơn một chút so với gợi ý đầy đủ của Spike nhưng có thể dễ dàng hơn. Ngoài ra, hãy đảm bảo rằng bạn thử nó trên một cái gì đó khác trước vì một số trình chỉnh sửa sẽ từ chối lưu trên một tệp đã thay đổi so với họ trừ khi bạn tải lại tệp đó (mất tất cả các thay đổi của bạn)


0

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 khác biệt, hoàn nguyên, v.v., sẽ là kiểm tra hai bản sao của kho lưu trữ và sử dụng một công cụ khác trực quan như DeltaWalker để sao chép các tệp từ cái này sang cái khác.

Bản sao đầu tiên sẽ là bản bạn thực sự làm việc và bản sao thứ hai chỉ dành cho mục đích này. Khi bạn đã thực hiện rất nhiều thay đổi đối với 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
  1. Sao chép tất cả các tệp đã sửa đổi liên quan vào các 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 patchcông cụ hoặc bằng cách chỉnh sửa thủ công hoặc bất cứ điều gì.
  5. Chạy diffsau đó để so sánh bản sao làm việc của bạn với bản sao lưu của bạn để đảm bảo rằng bạn đã áp dụng các phần vá lỗi một cách 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.