Làm cách nào để hoàn nguyên cam kết SVN?


303

Tôi đã tìm thấy nhiều ví dụ khác nhau về cách hoàn nguyên một cam kết SVN như

svn merge -r [current_version]:[previous_version] [repository_url]

hoặc là

svn merge -c -[R] .

Nhưng dường như không ai trong số họ làm việc. Tôi đã thử các lệnh đó và kiểm tra các tệp được thay đổi bằng tay.

Làm cách nào để hoàn nguyên cam kết với số sửa đổi 1944? Làm cách nào để kiểm tra hoàn nguyên đã được thực hiện (mà không tìm trong tệp thực tế với các thay đổi đã được hoàn nguyên)?


16
Bạn không bao giờ chấp nhận một câu trả lời vì không ai trong số họ làm việc?
2rs2ts

4
Nếu bạn muốn có câu trả lời theo nghĩa đen, hãy sử dụng "svn merge -c -1944." Để kiểm tra xem nó có hoạt động không: "svn diff"
John Sampson



Nếu trường hợp, tôi có 1943 (cam kết tốt), thì 1944 (cam kết xấu), sau đó là 1945 (cam kết tốt), sau đó là 1946 (cam kết tốt). Bây giờ tôi muốn xóa chỉ 1944 (cam kết xấu) và giữ tất cả sửa đổi sau năm 1944, có nghĩa là tôi muốn một kết quả như 1943,1945,1946 (chỉ xóa 1944) khỏi tất cả các sửa đổi này, tôi phải làm sao ??
Bhavin_m

Câu trả lời:


448

Cả hai ví dụ đều phải hoạt động, nhưng

svn merge -r UPREV:LOWREV . hoàn tác phạm vi

svn merge -c -REV . hoàn tác sửa đổi

trong cú pháp này - nếu thư mục hiện tại là WC và (như phải thực hiện sau mỗi lần hợp nhất), bạn sẽ cam kết kết quả

Bạn có muốn xem nhật ký?


9
@dwjohnston - vâng, việc hợp nhất luôn được thực hiện trong WC và đó không phải là nhiệm vụ phía máy chủ
Lazy Badger

14
svn: Merge source required. Không có con xúc xắc.
2rs2ts

27
@ 2rs2ts có vẻ như bạn đã quên dấu chấm để chỉ định 'làm điều này trong thư mục hiện tại'.
Dalin

14
bạn cũng có thể thực hiện nhiều lần xác nhận cùng một lúc:svn merge -c -42587,-42589 .
mledit

1
@ahnbizcad - sửa đổi (độc thân), mà bạn muốn hoàn tác
Lazy Badger

130

Nếu bạn đang sử dụng ứng dụng khách TortoiseSVN , việc này dễ dàng được thực hiện thông qua hộp thoại Hiển thị nhật ký .


5
Đây là cách dễ nhất để làm điều đó
Markku K.

5
Điều này đã lỗi thời. Không còn có Menu ngữ cảnh có sẵn cho máy khách trong phiên bản hiện tại.
dùng1789573

19
Gì? TortoiseSVN LÀ một menu ngữ cảnh, cộng với các hộp thoại mà nó sinh ra. Bạn có ý nghĩa gì bởi "không còn là một menu ngữ cảnh"? Chắc chắn là có!
Ben

@Ben Tôi nghĩ rằng user1789573 đã bị vấp một chút so với đề cập rõ ràng về "Menu ngữ cảnh" trong hướng dẫn được liên kết đến trong câu trả lời.
Tom Catullo

2
Trong trường hợp bạn nhìn thấy điều này sau đó, nó vẫn ở đó. Trong màn hình nhật ký chương trình, nhấp chuột phải vào bản sửa đổi và có tùy chọn "Hoàn nguyên bản sửa đổi này". Đây là trong TortoiseSVN 1.9.4 Build 27285. Tôi vừa sử dụng nó và có thể cho bạn biết nó hoạt động tốt.
Bruce Van Horn

65

svn merge -r 1944:1943 .sẽ hoàn nguyên các thay đổi của r1944 trong bản sao làm việc của bạn. Sau đó, bạn có thể xem lại các thay đổi trong bản sao làm việc của mình (với diff), nhưng bạn cần phải cam kết để áp dụng hoàn nguyên vào kho lưu trữ.


4
Không hoạt động, yêu cầu nguồn hợp nhất. Đã thử svn merge -r 1944:1943 .thay thế, nhưng không có gì thay đổi.
Alex

Các kho lưu trữ đã nâng cao kể từ r1944? Nếu vậy, có những thay đổi mâu thuẫn trên cùng một dòng với những thay đổi giữa r1943 và r1944 không?
vào

Tôi đang sửa đổi năm 1945 và dường như không có xung đột. Không svn statusphải cũng không svn diffcho bất cứ điều gì.
Alex

7
Lỗi:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
Nhưng svn merge -r 1945:1943 .dường như đã làm việc. Tôi nghĩ tôi hiểu: Bạn cần hợp nhất phiên bản từ 'trước' cam kết 'xấu' vào kho lưu trữ làm việc của bạn. Điều này là ổn khi bạn muốn thực hiện một 'hoàn nguyên' đơn giản của cam kết trước đó. Nhưng nếu bạn muốn hoàn nguyên các thay đổi được thực hiện với phiên bản 1900 thì sao?
Alex

45

Đầu tiên, hoàn nguyên bản sao làm việc đến năm 1943.

> svn merge -c -1943 .

Thứ hai, kiểm tra những gì sắp được cam kết.

> svn status

Thứ ba, cam kết phiên bản năm 1945.

> svn commit -m "Fix bad commit."

Thứ tư, nhìn vào nhật ký mới.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
Nếu trường hợp, tôi có 1943 (cam kết tốt), thì 1944 (cam kết xấu), sau đó là 1945 (cam kết tốt), sau đó là 1946 (cam kết tốt). Bây giờ tôi muốn xóa chỉ 1944 (cam kết xấu) và giữ tất cả sửa đổi sau năm 1944, có nghĩa là tôi muốn một kết quả như 1943,1945,1946 (chỉ xóa 1944) khỏi tất cả các sửa đổi này, tôi phải làm sao ??
Bhavin_m

26

Không thể "không phổ biến" một bản sửa đổi, nhưng bạn có thể hoàn nguyên bản sao làm việc của mình thành phiên bản 1943 và cam kết đó là phiên bản năm 1945. Các phiên bản 1943 và 1945 sẽ giống hệt nhau, hoàn toàn thay đổi các thay đổi.


18
Để chính xác một cách khó chịu, tôi sẽ nhận xét rằng nếu bạn có quyền truy cập quản trị viên vào kho lưu trữ, bạn có thể "không phổ biến". Điều này bằng cách tạo một kho lưu trữ bản sao lên đến một sửa đổi nhất định bằng cách sử dụng svn dumpvà sau đó svn load. Nhưng, tất nhiên, điều này không nên được sử dụng trong trường hợp bình thường.
vào

4
Tôi không muốn làm phiền, tôi muốn tạo một số cam kết mới với một cam kết nhất định được đảo ngược. Các bộ nói rằng tôi đã kiểm tra phiên bản 1944, đã thực hiện một cam kết vào năm 1945, mà tôi muốn 'hoàn nguyên'. Sau đó, tôi muốn có một phiên bản 1946, có tệp giống hệt với phiên bản 1944. (Ngoại trừ lịch sử tất nhiên.) Nhưng câu hỏi vẫn là: Làm thế nào để làm điều đó? Các lệnh là gì?
Alex

//, @Alex, tôi cũng thích điều này, đặc biệt là ở một cái gì đó tương tự $ git revert. Tôi thấy hơi khó học SVN sau khi sử dụng Git quá lâu.
Nathan Basan

10

Sau đây sẽ làm một chạy khô, như nó nói. CHÍNH là phiên bản hiện tại, PREV là trước đó, sau đó là đường dẫn đến tệp của bạn hoặc mục đã cam kết:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Nếu chạy khô có vẻ tốt, hãy chạy lệnh mà không có --dry-run

Xác nhận thay đổi trong sửa đổi và cam kết lại. Để duyệt số phiên bản, hãy thử:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Điều này có yêu cầu bản sao cục bộ khác với bản sửa đổi xấu không?
Eliezer Miron

2

Alex, hãy thử điều này: svn merge [WorkFolderPath] -r 1944: 1943


2

Mặc dù các đề xuất đã đưa ra có thể có hiệu quả với một số người, nhưng nó không hoạt động đối với trường hợp của tôi. Khi thực hiện hợp nhất, người dùng rev 1443cập nhật rev 1445, vẫn đồng bộ hóa tất cả các tệp đã thay đổi 1444mặc dù chúng bằng với 1443hợp nhất. Tôi cần người dùng cuối để không thấy bản cập nhật nào cả.

Nếu bạn muốn ẩn hoàn toàn cam kết thì có thể bằng cách tạo một nhánh mới ở lần sửa đổi chính xác và sau đó hoán đổi các nhánh. Điều duy nhất là bạn cần phải loại bỏ và thêm lại tất cả các khóa.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Điều này làm việc cho tôi, có lẽ nó sẽ hữu ích cho người khác ngoài kia =)


2
svn merge -c -M PATH

Điều này đã cứu cuộc đời tôi.

Tôi đã có cùng một vấn đề, sau khi quay trở lại tôi cũng không thấy mã cũ. Sau khi chạy lệnh trên, tôi nhận được một mã phiên bản cũ sạch.


1

Tôi đã thử ở trên, ( svn merge) và bạn nói đúng, nó có kích. Tuy nhiên

svn update -r <revision> <target> [-R]

dường như hoạt động, nhưng không vĩnh viễn (svn của tôi chỉ đơn giản là hiển thị một bản sửa đổi cũ). Vì vậy tôi đã phải

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

Trong trường hợp cụ thể của tôi mục tiêu của tôi là interfaces/AngelInterface.php. Tôi đã thực hiện các thay đổi cho tệp, cam kết chúng, cập nhật máy tính xây dựng chạy trình biên dịch phpdoc và thấy các thay đổi của tôi là một sự lãng phí thời gian. svn log interfaces/AngelInterface.phpcho thấy sự thay đổi của tôi là r22060 và cam kết trước đó trên tệp đó là r22059. Vì vậy, tôi có thể svn update -r 22059 interfaces/AngelInterface.phpvà tôi kết thúc với mã như trong -r22059 một lần nữa. Sau đó :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Ngoài ra, tôi có thể làm điều tương tự trên một thư mục, bằng cách chỉ định . -Rthay cho interfaces/AngelInterface.phptất cả các mục trên.


1
Một điều khác, như đã nói, những gì bạn không thể làm là xóa cam kết khỏi lịch sử, giống như bạn có thể làm trong git bằng cách hack trực tiếp các ref. Tất cả những gì bạn có thể làm là sử dụng kho lưu trữ để thay đổi nguồn của bạn theo cách bạn dự định và cam kết đó là một thay đổi.
sibaz

Sau khi nghiên cứu sâu hơn, tôi có thể thấy rằng có thể xóa cam kết khỏi lịch sử bằng svnadmin nhưng bạn nên chống lại nó. Xem stackoverflow.com/questions/5566327/
Mạnh

0

Nếu bạn muốn xóa hoàn toàn các xác nhận khỏi lịch sử, bạn cũng có thể thực hiện kết xuất repo tại một phiên bản cụ thể, sau đó nhập kết xuất đó. Đặc biệt:

svnrdump dump -r 1:<rev> <url> > filename.dump

Lệnh svnrdump thực hiện chức năng tương tự như svnadmin dump nhưng hoạt động trên một repo từ xa.

Tiếp theo chỉ cần nhập tệp kết xuất vào repo của bạn lựa chọn. Điều này đã được thử nghiệm để hoạt động tốt trên Beanstalk.

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.