Có lệnh Subversion để đặt lại bản sao làm việc không?


110

Có một lệnh Subversion duy nhất sẽ "đặt lại" một bản sao đang hoạt động chính xác về trạng thái được lưu trữ trong kho lưu trữ không? Một cái gì đó như git reset --hardhoặc (ha, hard Git reset cũng không xóa các tệp không phiên bản!) rm -rf wc && svn co <url> wc.

Cập nhật: Tôi không muốn hoàn nguyên đơn giản, vì điều đó không xóa các tệp bổ sung trong bản sao đang hoạt động. Tôi thực sự muốn một cái gì đó giống như xóa bản sao đang hoạt động và kiểm tra lại mà không cần phải tải xuống lại dữ liệu. (Rõ ràng là tôi không ngại mất tất cả các thay đổi chưa cam kết.)


hoàn nguyên tất cả các thay đổi trong bản sao làm việc?
mauris

5
Bạn sẽ sử dụng git clean -xdfđể xóa những thứ không được kiểm soát nguồn.
vcsjones

1
@vcsjones: Cảm ơn, trang người đàn ông đã git cleantrích dẫn chính xác những gì tôi đang tìm kiếm: “Điều này có thể được sử dụng (có thể kết hợp với git reset) để tạo một thư mục hoạt động nguyên bản để kiểm tra một bản dựng sạch." Đáng tiếc rằng Subversion dường như không có bất cứ thứ gì như thế này được tích hợp sẵn.
zoul

Câu trả lời:


180

Bạn có thể hoàn nguyên một cách đệ quy như sau:

svn revert --recursive .

Không có cách nào (mà không cần viết kịch bản sáng tạo) để loại bỏ những thứ không được kiểm soát nguồn. Tôi nghĩ rằng cách gần nhất bạn có thể làm là lặp lại tất cả các tệp, sử dụng sau đó ghi lại kết quả của svn listgrep và nếu grep không thành công, thì hãy xóa nó.

CHỈNH SỬA : Giải pháp cho tập lệnh quảng cáo là ở đây: Tự động xóa các tệp không phiên bản Subversion

Vì vậy, bạn có thể tạo một tập lệnh kết hợp một revertvới bất kỳ câu trả lời nào trong câu hỏi được liên kết phù hợp với bạn nhất.


3
Bạn cũng có thể muốn chạy svn cleanuptrên wc trước. Đây là thực hành tiêu chuẩn của tôi để dọn dẹp sau khi hợp nhất bị hủy bỏ và những gì khác.
Mike Miller

rùa cũng có một tùy chọn "loại bỏ các tệp không phiên bản" trong hộp thoại dọn dẹp.
v.oddou

2
Sẽ rất tuyệt nếu "loại bỏ các tệp không phiên bản" có sẵn thông qua dòng lệnh. Đặc biệt là đối với các bản dựng tự động.
C. Tewalt

3
Xem câu trả lời của tôi ... --remove-không phiên bản tồn tại cho dọn dẹp svn
Denny Weinberg

38

Để hoàn nguyên các tệp được theo dõi

svn revert . -R

Để làm sạch các tệp không được theo dõi

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Ban đầu -rfcó thể / nên trông đáng sợ, nhưng sau khi hiểu nó sẽ không phải vì những lý do sau:

  1. Chỉ những thư mục hoàn toàn không được kiểm soát mới khớp với mẫu được chuyển đến rm
  2. -rfbắt buộc, nếu không các thư mục này sẽ không bị xóa

Để hoàn nguyên sau đó làm sạch (câu hỏi OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Để dễ sử dụng nhất quán

Thêm bí danh vĩnh viễn vào .bash_aliases của bạn

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

đoạn mã thứ 2 dường như không hiệu quả với tôi:awk: fatal: error reading input file '-': Input/output error
hbogert

Tôi phải thoát khỏi ?trong awklệnh, nếu không nó phù hợp tất cả các dòng trong đầu ra củasvn status
gpanders

23

Xóa mọi thứ bên trong bản sao cục bộ của bạn bằng cách sử dụng:

rm -r your_local_svn_dir_path/*

Và hoàn nguyên mọi thứ một cách đệ quy bằng lệnh dưới đây.

svn revert -R your_local_svn_dir_path

Cách này nhanh hơn so với việc xóa toàn bộ thư mục và sau đó kiểm tra lại, vì các tệp đang được khôi phục từ dữ liệu meta SVN cục bộ của bạn. Nó thậm chí không cần kết nối mạng.


4
nhanh hơn nhiều là dọn dẹp svn --remove-unversions.
Znik

7
svn revert . -R

để thiết lập lại mọi thứ.

svn revert path/to/file

cho một tệp duy nhất


1
Điều đó không xóa các tệp không được phiên bản bổ sung trong bản sao đang làm việc, phải không?
zoul

@zoul Tôi không nghĩ như vậy, nhưng không báo cho tôi về điều đó vì nó được một lúc kể từ khi tôi sử dụng SVN
Abe Voelker

tiếc là nó không chạm vào các tệp không được theo dõi. thử hoàn nguyên svn -R your_local_svn_dir_path
Znik

7

Xóa các tệp không phiên bản và hoàn nguyên mọi thay đổi:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Ngoài:

D         D:\tmp\sql\update\abc.txt

1
đây là câu trả lời tốt nhất mà không cần thêm tập lệnh. cái này phổ biến và tương thích với nhiều phiên bản svn.
Znik

3

Giải pháp cmd / bat Windows thuần túy:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

Xóa bản sao đang hoạt động khỏi hệ điều hành và kiểm tra lại là đơn giản nhất, nhưng rõ ràng không phải là một lệnh duy nhất.


Chậm một cách đau đớn. Đó là lý do tại sao tôi đang tìm cách giải quyết vấn đề này.
zoul

1
+1, Đây thường là cách duy nhất để khắc phục các vấn đề kỳ lạ, ít nhất là tôi đã tìm thấy.
Brad

2

Rất nhanh chóng và đơn giản và làm chính xác những gì bạn muốn

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(Config|.ini)/ là dành cho mục đích của riêng tôi.

Và có thể là một ý tưởng hay khi thêm --no-ignore vào lệnh svn


2
Thật là khủng khiếp. Người dùng Windows thì sao? Subversion rõ ràng cần một chút công việc trước khi nó có thể được coi trọng như một công cụ kiểm soát phiên bản.
Warren P

1

Để xóa các tệp không được theo dõi

Tôi có thể liệt kê tất cả các tệp chưa được kiểm soát được báo cáo svn sttrong bash bằng cách thực hiện:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Nếu bạn cảm thấy may mắn, bạn có thể thay thế echobằng rmcách xóa các tệp không được theo dõi. Hoặc sao chép các tệp bạn muốn xóa bằng tay, nếu bạn cảm thấy kém may mắn.


(Tôi đã sử dụng câu trả lời của @ abe-voelker để hoàn nguyên các tệp còn lại: https://stackoverflow.com/a/6204601/1695680 )

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.