Hoàn nguyên tệp đơn trong SVN thành một bản sửa đổi cụ thể


182

Tôi có một tệp như được hiển thị bên dưới trong một repo SVN mà tôi muốn hoàn nguyên về phiên bản trước. Cách để làm điều này trong SVN là gì? Tôi chỉ muốn hạ cấp tệp cụ thể này xuống phiên bản cũ hơn, không phải toàn bộ repo.

Cảm ơn.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

Khi bạn nói hoàn nguyên, ý của bạn là gì, 7 năm trước, lol
Kalpesh Soni

Câu trả lời:


181

Nếu bạn chỉ muốn tập tin cũ trong bản sao làm việc của bạn:

svn up -r 147 myfile.py

Nếu bạn muốn quay ngược lại, hãy xem phần " Cách quay lại phiên bản cũ hơn của mã của chúng tôi để lật đổ? ".


8
nhưng lần sau khi bạn cập nhật, nó sẽ nhận được tệp mà bạn không muốn quay lại ...: S
andygoestohollywood

2
nếu bạn không muốn quay lại, svn cam kết tệp đó, để đưa phiên bản bạn muốn vào repo
Packet Tracer

14
Điều này có lẽ không thực sự làm những gì người hỏi câu hỏi muốn. Sử dụng điều này, bản sao làm việc sạch sẽ và không thể được cam kết NHƯ, và một "cập nhật svn" không có số phiên bản được chỉ định sẽ truy xuất phiên bản mới nhất, không mong muốn.
CXJ

1
Làm thế nào tôi có thể cam kết các tập tin hoàn nguyên sau đó?
marcio

2
Điều này không hoàn toàn đúng bởi vì, như CXJ đề cập, không có cách nào để cam kết tệp được cập nhật. Bạn có thể muốn làm như Mitch Dempsey nói (tuy nhiên, lưu ý - buộc phải ghi đè tệp): svn export --force -r 147
myfile.py myfile.py

76

mèo svn mất một phiên bản sửa đổi quá!

svn cat -r 175 mydir/myfile > mydir/myfile


20
Đây là câu trả lời tốt nhất trên trang. Nó để lại tập tin thay đổi trong trạng thái có thể được cam kết.
dotancohen

điều này dường như không hoạt động khi bạn dán vào một tập tin mới
ahnbizcad

haha nhìn lại nó, idk tôi đã nghĩ đến bối cảnh nào khi tôi đăng bài. Tôi không thể nhớ lại. Nó có vẻ vô nghĩa.
ahnbizcad

Điều này rất đơn giản và dễ hiểu khi bạn chỉ muốn hoàn tác các thay đổi của mình và đưa tệp trở lại trạng thái cam kết trước mà không có bất kỳ kỹ thuật kiểm soát phiên bản nào.
Ẩn danh

57
svn revert filename 

điều này sẽ hoàn nguyên một tập tin duy nhất.


4
Có chuyện gì với tất cả các câu trả lời khác với các lệnh dài hơn? Cảm ơn.
masterxilo

Không có gì. Tôi không biết chuyện gì đang xảy ra với những câu trả lời khác .. lol
thestar

13
Điều này trở lại bản sửa đổi nào? Doc nói chỉ cần thay thế bằng mới nhất trong repo. Câu hỏi là làm thế nào để trở lại một phiên bản trước đó.
tgkprog

1
Điều này trở lại phiên bản mới nhất của repo. Nếu bạn đọc mô tả của các câu hỏi, có vẻ như anh ta đang tìm cách hoàn nguyên một tệp chứ không phải toàn bộ thư mục.
thestar

5
Tôi tin rằng tất cả những điều này là phá hủy bản sao làm việc của bạn bằng cách 'hoàn nguyên' nó trở lại đầu. Hoặc mà đã từng được kiểm tra. xác nhận bằng cách thực hiện tập tin svn update -r, sau đó thực hiện hoàn nguyên svn.
Gerard ONeill

50

Đối với một tệp duy nhất, bạn có thể làm:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Bạn có thể làm svn revert <file>nhưng điều đó sẽ chỉ khôi phục bản sao làm việc cuối cùng.


2
xuất, sau đó dán nó vào bản sao cục bộ của bạn, sau đó cam kết lại?
tgkprog

1
@tgkprog đó là một cách để làm điều đó, vâng
Mitch Dempsey

@tgkprog và cách "ưa thích" là gì?
hbogert

Không có ý tưởng nhưng đó là những gì làm việc cho tôi: xuất bản sửa đổi trong quá khứ. Đã mở trong notepad, sao chép, dán vào tập tin làm việc. Cam kết rằng để đứng đầu với nhận xét về rev và tại sao. Các công cụ UI có thể có một cách tốt hơn.
tgkprog

21

Cho đến nay, tất cả các câu trả lời ở đây dường như đều có nhược điểm đáng kể, rất phức tạp (cần tìm URI repo) hoặc họ không làm những gì mà câu hỏi có thể yêu cầu: Làm thế nào để Repo trở lại trạng thái hoạt động với phiên bản cũ hơn của tập tin .

svn merge -r head:[revision-number-to-revert-to] [file-path]IMO là cách sạch nhất và đơn giản nhất để làm điều này. Xin lưu ý rằng việc mang lại một tệp đã bị xóa dường như không hoạt động theo cách này [1]. Xem thêm câu hỏi sau: Cách tốt hơn để hoàn nguyên bản sửa đổi SVN trước đó của tệp?

[1] Để biết điều bạn muốn svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up, hãy xem thêm Cách chính xác để khôi phục tệp đã xóa khỏi SVN là gì?


Tôi muốn nhận xét rằng ít nhất là đối với phiên bản Subversion của tôi, svn mergekhông lấy nhiều tệp làm đối số vì một số lý do. Trong trường hợp này, nó dường như không làm gì cả (không có thông báo lỗi).
Wrzlprmft

Nhưng lệnh của tôi vẫn hoạt động bằng cách lặp lại nó cho mỗi tệp, phải không?
Michel Müller

Vâng, nó thực sự.
Wrzlprmft

1
Đồng ý rằng đây là sạch nhất.
KevinG

13

Cách tốt nhất là:

svn merge -c -RevisionToUndo ^/trunk

Điều này sẽ hoàn tác tất cả các tệp của bản sửa đổi thay vì chỉ hoàn nguyên các tệp mà bạn không muốn hoàn tác. Đừng quên dấu gạch ngang ( -) làm tiền tố cho sửa đổi.

svn revert File1 File2

Bây giờ cam kết thay đổi trở lại.


9

Bạn muốn làm

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Khi bạn làm điều đó, bạn sẽ có bản sửa đổi của tệp ở trạng thái có thể gắn được. Cam kết tập tin.


7

Tôi thấy thật đơn giản để thực hiện việc này thông qua svn catlệnh để bạn thậm chí không phải chỉ định sửa đổi.

svn cat mydir/myfile > mydir/myfile

Điều này có thể sẽ không đóng vai trò trở lại dữ liệu inode (siêu dữ liệu) như dấu thời gian.


sau đó cam kết tập tin để nó đi đến repo
tgkprog

3
Điều này làm việc cho tôi tốt hơn so với cập nhật. Bởi vì cập nhật không cho phép bạn cam kết sửa đổi được thực hiện cho tập tin đó. (svn 1.8.3)
fe_lix_

7

ngạc nhiên không ai đề cập đến điều này

mà không tìm ra số sửa đổi bạn có thể viết cái này, nếu bạn vừa cam kết điều gì đó mà bạn muốn hoàn nguyên, điều này sẽ không hoạt động nếu bạn thay đổi một số tệp khác và tệp đích không phải là tệp thay đổi cuối cùng

svn merge -r HEAD:PREV file

Nếu bạn có ý kiến ​​xin vui lòng thảo luận ở đây trước khi chỉnh sửa?
Kalpesh Soni

1
Không phải kịch bản trong câu hỏi yêu cầu hợp nhất ngược lại với thay đổi gần đây nhất, sao cho chúng ta nên áp dụng các thay đổi cần thiết để chuyển từ ĐẦU sang PREV?
Nick Russo

4
Lệnh phải svn merge -r HEAD:PREV filenhư @Nick Russo đã nói
Heinz

4

Nếu đó chỉ là một vài tệp và nếu bạn đang sử dụng Rùa SVN, bạn có thể sử dụng phương pháp sau:

  1. Nhấp chuột phải vào tệp nguồn của bạn và chọn "TortoiseSVN" -> "Hiển thị nhật ký".
  2. Nhấp chuột phải vào một sửa đổi trong nhật ký và chọn "Lưu sửa đổi vào ...".
  3. Hãy để bản sửa đổi cũ ghi đè lên tập tin hiện tại của bạn.
  4. Cam kết tập tin nguồn bị ghi đè.

Điều này sẽ lưu một tệp không đảo ngược mới, chẳng hạn như tệp-xxxx trong đó xxxx là số sửa đổi cũ. Chúng ta làm gì tiếp theo? xóa bản sửa đổi mới (ví dụ CHÍNH), đổi tên tệp mới, thêm, cam kết?
Heinz

Không, đừng lưu nó với số sửa đổi trong tên tệp. Lưu nó với chính xác cùng tên tệp với phiên bản hiện tại của cùng một tệp (nói cách khác, không có xxxx trong tên tệp). Sau đó chỉ cần làm một cam kết bình thường sau đó.
Elling

4

Chỉ cần thêm vào câu trả lời @Mitch Dempsy vì tôi chưa có đủ đại diện để bình luận.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Thêm --force sẽ ghi đè lên bản sao cục bộ bằng bản xuất và sau đó bạn có thể thực hiện một cam kết svn để đẩy nó vào kho lưu trữ.


và đây là câu trả lời hay nhất :)
Zgr3doo

Tại sao đây là câu trả lời tốt nhất? nó không quản lý lịch sử theo "cách svn"
Jason S

2

Một tùy chọn thay thế cho một tệp duy nhất là "thay thế" phiên bản hiện tại của tệp bằng bản sửa đổi cũ hơn:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Điều này có tính năng bổ sung rằng các thay đổi không mong muốn không hiển thị trong nhật ký cho tệp này (ví dụ: tệp nhật ký svn.ext).


1

Nếu bạn muốn khôi phục một tệp riêng lẻ từ một bản sửa đổi cụ thể và có thể cam kết, thì hãy làm:

hợp nhất svn -c - [OldRev #] [Tên tệp]

I E. svn merge -c -150 myfile.py

Lưu ý tiêu cực về số sửa đổi


-1
sudo svn revert filename

đây là cách tốt hơn để hoàn nguyên một tập tin


2
Tôi thực sự hy vọng bạn không bao giờ đến gần một cỗ máy sản xuất có quyền sudoer.
David Lakatos
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.