Cách chính xác để khôi phục tệp đã xóa khỏi SVN là gì?


119

Tôi đã xóa một tệp khỏi repo và bây giờ muốn đặt nó trở lại. Điều tốt nhất tôi có thể tìm ra là:

  • cập nhật bản sửa đổi trước khi xóa
  • sao chép các tập tin ở nơi khác
  • cập nhật lên đầu
  • sao chép các tập tin lại
  • thêm chúng
  • cam kết

Điều đó chỉ có mùi hôi và nó mất tất cả lịch sử để khởi động. Phải có một cách tốt hơn để làm điều này. Tôi đã tìm trong Sách SVN nhưng không tìm thấy gì cả và hiện đang tìm kiếm danh sách thẻ SVN.


4
Chắc chắn câu trả lời của tukushan là câu trả lời trực tiếp chính xác cho câu hỏi của bạn, và nên được chấp nhận?
James McCormack

@JamesMcCormack: xem NB trong câu trả lời của anh ấy.
BCS

2
Một mẹo nhỏ, nếu bạn đã xóa tệp và chưa thực hiện thay đổi, chỉ cần nhấp chuột nhanh và cập nhật sẽ khôi phục tệp đó.
Hammad Khan

Câu trả lời:


57

Sử dụng hợp nhất svn:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Vì vậy, một ví dụ:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Đối với TortoiseSVN (Tôi nghĩ ...)

  • Nhấp chuột phải vào Explorer, đi tới TortoiseSVN -> Hợp nhất ...
  • Đảm bảo rằng "Hợp nhất một loạt các bản sửa đổi" được chọn, nhấp vào Tiếp theo
  • Trong hộp văn bản "Phạm vi sửa đổi để hợp nhất", chỉ định bản sửa đổi đã xóa tệp
  • Chọn hộp kiểm "Hợp nhất ngược", nhấp vào Tiếp theo
  • Nhấp vào Hợp nhất

Tuy nhiên, điều đó hoàn toàn chưa được kiểm chứng.


Biên tập bởi OP : Điều này hoạt động trên phiên bản TortoiseSVN của tôi (loại cũ không có nút tiếp theo)

  • Đi tới thư mục mà nội dung đã được xóa
  • Nhấp chuột phải vào Explorer, đi tới TortoiseSVN -> Hợp nhất ...
  • trong phần Từ nhập bản sửa đổi đã xóa
  • trong phần Tới , hãy nhập bản sửa đổi trước khi xóa.
  • Nhấp vào "hợp nhất"
  • cam kết

Bí quyết là hợp nhất ngược lại . Kudo to sean.bright vì đã chỉ cho tôi đi đúng hướng!


Chỉnh sửa: Chúng tôi đang sử dụng các phiên bản khác nhau. Phương pháp tôi mô tả đã hoạt động hoàn hảo với phiên bản TortoiseSVN của tôi.

Cũng cần lưu ý rằng nếu có nhiều thay đổi trong cam kết mà bạn đang hợp nhất ngược lại, bạn sẽ muốn hoàn nguyên những thay đổi khác đó khi quá trình hợp nhất được thực hiện trước khi bạn cam kết. Nếu bạn không, những thay đổi bổ sung đó cũng sẽ bị đảo ngược.


Tôi đang sử dụng windows và không có phiên bản CLI của SVN. bạn có biết làm thế nào để ortoiseSVN làm điều đó?
BCS

Rùa đã "hợp nhất" trên menu chuột phải. Nó có các ô để điền vào vòng quay. Cũng "Chạy khô" để xem bạn đã đặt đúng chưa. Và hãy nhớ, kết quả không được tính cho đến khi bạn thực hiện nó. Bạn có thể hoàn nguyên nếu mọi thứ vẫn ổn.
gbarry

Tôi muốn nói rằng OP có phiên bản cũ hơn của Tortoise. Một trong những phiên bản mới hơn có (kém) hộp thoại hợp nhất khác nhau
1800 INFORMATION

Tôi vẫn chưa thấy BẤT KỲ hệ thống hợp nhất nào không hấp dẫn. Văn bản, tệp, dirs, tài liệu Word, yuck. Tôi nghĩ đó không phải là một vấn đề có thể giải quyết được. Những thứ OTOH có thể hút nhiều hơn hoặc ít hơn. :)
BCS

1
Nếu bạn hoàn nguyên một số tệp và sau đó hoàn nguyên thì một trong những hoàn nguyên đó là không hoàn nguyên. Oái oăm! Tôi điều tôi chỉ làm tổn thương một cái gì đó.
BCS

176

Vấn đề khi thực hiện hợp nhất svn theo đề xuất của Sean Bright là giới thiệu lại các thay đổi khác được thực hiện trong cùng một bản sửa đổi với việc xóa. Bản sao svn là một hoạt động được nhắm mục tiêu hơn sẽ chỉ ảnh hưởng đến các tệp đã bị xóa.

Sử dụng Tortoise SVN, bạn có thể phục hồi một tệp đã bị xóa khỏi thư mục bản sao làm việc của bạn và từ các bản sửa đổi SVN sau này, thông qua bản sao svn như sau:

  • Duyệt đến thư mục bản sao đang làm việc đã chứa tệp trước đó.
  • Nhấp chuột phải vào thư mục trong Explorer, vào TortoiseSVN -> Hiển thị nhật ký.
  • Nhấp chuột phải vào số bản sửa đổi ngay trước bản sửa đổi đã xóa tệp và chọn "Duyệt kho lưu trữ".
  • Nhấp chuột phải vào tệp đã xóa và chọn "Copy to working copy ..." và lưu.

Tệp đã xóa bây giờ sẽ nằm trong thư mục bản sao đang hoạt động. Để thêm lại nó vào SVN, nhấp chuột phải vào tệp đã khôi phục và chọn Cam kết SVN.

NB: Phương pháp này sẽ bảo toàn lịch sử trước đó của tệp đã khôi phục, tuy nhiên để xem lịch sử trước đó trong nhật ký TortoiseSVN, bạn cần đảm bảo rằng "Dừng khi sao chép / đổi tên" được bỏ chọn trong hộp thoại Thông báo nhật ký.


26
Đây cũng có thể được thực hiện trực tiếp trên máy chủ, hữu ích nếu các tập tin bị xóa hoặc thư mục khá lớn: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig

Đây là cách làm đúng. Chỉ cần thử với TortoiseSVN 1.8.1 và nó hoạt động như lời khuyên.
Tiến sĩ Gianluigi Zane Zanettini

Hoàn hảo!! Đơn giản và hiệu quả. Cảm ơn vì giải pháp
Hunter

Phương pháp này giúp tôi khôi phục tệp thành nhánh con đã bị xóa khỏi nhánh mẹ của nó dễ dàng hơn nhiều. Có lẽ có một cách để làm điều đó merge, nhưng tôi không tìm ra nó.
arr_sea

"Chỉ trước" trong bước 3 là quan trọng. Trong bước 4, Tortoise tiếp tục phàn nàn rằng tệp đã tồn tại, mặc dù tôi đã xóa nó bằng cách xóa Windows. Tôi phải cập nhật bản sao làm việc của mình trước. (Đồng nghiệp của tôi đã xóa một số tệp bằng cách xóa Tortoise, và sau đó thực hiện các thay đổi.) TortoiseSVN 1.8.1.
leqid

27

Đối với sự đầy đủ, đây là những gì bạn sẽ tìm thấy trong cuốn sách svn, bạn đã biết những gì cần tìm. Đó là những gì bạn đã khám phá ra:

Đang hoàn tác thay đổi

Phục hồi các mục đã xóa

Điều tương tự, từ phiên bản gần đây hơn (và chi tiết) của cuốn sách:

Đang hoàn tác thay đổi

Phục hồi các mục đã xóa


3
Chỉ cần hiển thị hầu hết các vấn đề là biết những gì cần tìm.
BCS

16

Sử dụng chức năng sao chép Tortoise SVN để hoàn nguyên các thay đổi đã cam kết:

  1. Nhấp chuột phải vào thư mục mẹ chứa các tệp / thư mục đã xóa
  2. Chọn "nhật ký hiển thị"
  3. Chọn và nhấp chuột phải vào phiên bản mà trước đó các thay đổi / xóa được thực hiện
  4. Chọn "kho lưu trữ duyệt"
  5. Chọn tệp / thư mục cần được khôi phục và nhấp chuột phải
  6. Chọn "sao chép vào" sẽ sao chép các tệp / thư mục vào bản sửa đổi đầu

Hy vọng điều đó sẽ giúp


13

Tôi dường như luôn sử dụng svn copy làm hoạt động máy chủ nên không chắc liệu nó có hoạt động với hai đường dẫn làm việc hay không.

Dưới đây là một ví dụ về khôi phục tệp đã xóa thành bản sao làm việc cục bộ của dự án:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Khi đang ở trong thư mục dự án. Điều này cũng hoạt động để khôi phục toàn bộ thư mục.


2
+1 Bản sao @ đã hoạt động. Bản sao -r dường như không hoạt động khi sử dụng CollabNet svn 1.6.17 trong Mac OSX.
Màu xám,

2
Ngoài ra, bản sửa đổi được sử dụng phải là bản sửa đổi ngay trước khi xóa.
Màu xám

6

Nếu bạn đang sử dụng Tortoise SVN, bạn sẽ có thể hoàn nguyên các thay đổi từ bản sửa đổi đó thành bản sao làm việc của mình (thực hiện hợp nhất ngược một cách hiệu quả), sau đó thực hiện một cam kết khác để thêm lại tệp. Các bước cần thực hiện là:

  1. Duyệt đến thư mục trong bản sao đang làm việc nơi bạn đã xóa tệp.
  2. Chuyển đến trình duyệt repo.
  3. Duyệt đến bản sửa đổi nơi bạn đã xóa tệp.
  4. Trong danh sách thay đổi, hãy tìm tệp bạn đã xóa.
  5. Nhấp chuột phải vào tệp và đi tới "Hoàn nguyên các thay đổi từ bản sửa đổi này".
  6. Thao tác này sẽ khôi phục tệp về bản sao làm việc của bạn, lưu giữ lịch sử.
  7. Cam kết thêm tệp vào kho lưu trữ của bạn.

OK trong trường hợp đó, câu hỏi là làm thế nào để thực hiện những gì bạn vừa mô tả. (Trả lời: ngược sử dụng merge)
BCS

1
Tôi đã nói về cách làm điều đó trong Tortoise SVN. Tôi sẽ bổ sung thêm chi tiết.
davogones

5

Cách dễ nhất mà tôi có thể khôi phục tệp và không mất lịch sử sửa đổi là sử dụng bản sao SVN , ví dụ hợp nhất ở trên đối với tôi có vẻ như là một cách phức tạp hơn để đạt được điều tương tự. Tại sao cần phải hợp nhất khi bạn chỉ muốn khôi phục một bản sửa đổi?

Tôi sử dụng phần sau trong trường hợp này và nó hoạt động khá tốt.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Tôi dường như luôn sử dụng svn copynhư một hoạt động máy chủ nên không chắc liệu nó có hoạt động với hai đường dẫn làm việc hay không.


3
SVN COPY là cách tiếp cận được khuyến nghị. Cú pháp rất đơn giản: svn copy [SVN URL] @ [REVISION # WHERE FILE TỒN TẠI] [LOCAL PATH TO RESTORE TO] từ visualsvn.com/support/svnbook/branchmerge/basicmerging . Tôi chỉ sử dụng cái này.
amit

Điều này làm cho ý nghĩa nhất đối với tôi, tôi cũng sử dụng phương pháp này
Dmitry Pashkevich

4

Với Tortoise SVN :

Nếu bạn chưa thực hiện các thay đổi của mình, bạn có thể hoàn nguyên trên thư mục mẹ nơi bạn đã xóa tệp hoặc thư mục.

Nếu bạn đã cam kết tệp đã xóa, thì bạn có thể sử dụng trình duyệt kho lưu trữ, thay đổi thành bản sửa đổi nơi tệp vẫn tồn tại và sau đó sử dụng lệnh Copy to ... từ trình đơn ngữ cảnh. Nhập đường dẫn đến bản sao làm việc của bạn làm đích và tệp đã xóa sẽ được sao chép từ kho lưu trữ sang bản sao làm việc của bạn.


đẹp. Tôi sẽ thử điều đó vào lần sau.
BCS

1

Bạn sẽ có thể chỉ kiểm tra một tệp bạn muốn khôi phục. Hãy thử một cái gì đó như svn co svn://your_repos/path/to/file/you/want/to/restore@revở đâurev là phiên bản cuối cùng mà tại đó các tập tin tồn tại.

Tôi đã phải thực hiện chính xác điều này cách đây ít lâu và nếu tôi nhớ không nhầm thì việc sử dụng -rtùy chọn sẽ svnkhông hoạt động; Tôi đã phải sử dụng :revcú pháp. (Mặc dù tôi có thể đã nhớ nó ngược ...)


Đó không phải là điều tôi muốn. Tôi muốn vá lại tệp vào repo và SVN biết rằng đó là cùng một tệp.
BCS
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.