Lệnh SVN để xóa tất cả các tệp bị thiếu cục bộ


133

Trong SVN có lệnh nào tôi có thể sử dụng để xóa tất cả các tệp bị thiếu cục bộ trong một thư mục không?

Hoặc không thành công, một số cách liệt kê chỉ những tệp bị thiếu (hoặc, trong trường hợp tổng quát hơn, có trạng thái A, D,?, V.v.)


1
Tôi duy trì 1 thư mục làm việc và 1 thư mục thanh toán. Và chỉ di chuyển các tập tin từ thư mục làm việc sang thư mục kiểm tra. Nếu một thư mục phải được thêm / xóa, tôi thực hiện thủ công và sau đó di chuyển tệp vào thư mục đó (ví dụ: gói mới, gói cũ). Hầu hết các vấn đề svn xảy ra khi bạn di chuyển các thư mục trên bản sao làm việc của bạn. Ngay cả khi đối phó các tệp từ bản sao làm việc của bạn để kiểm tra bản sao, bạn chỉ nên di chuyển các tệp, không phải các thư mục.
Siddharth

Câu trả lời:


99

Nếu bạn đang sử dụng TortoiseSVN, chỉ cần thực hiện Kiểm tra sửa đổi , sắp xếp theo cột Trạng thái , chọn tất cả các mục được đánh dấu missing, nhấp chuột phải để mở menu ngữ cảnh và chọn Xóa . Cuối cùng, cam kết xuất bản các thay đổi cho kho lưu trữ.

Nếu bạn đang ở trên Windows, nhưng thích dòng lệnh và thích tìm hiểu về PowerShell, thì phần mềm này sẽ thực hiện thủ thuật:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Nghĩa là, chỉ lọc đầu ra thành những dòng hiển thị các tệp bị thiếu (được biểu thị bằng dấu chấm than ở đầu dòng), chụp tên tệp được liên kết và thực hiện một svn rmtên tệp đó.

(Bài đăng trên blog Loại bỏ tất cả các tập tin bị thiếu của Wikipedia khỏi bản sao làm việc của SVN thực hiện một số thứ tương tự cho Unix / Linux.)


Có cách nào trong nhật thực bằng cách sử dụng plugin subclipse không? thật tệ khi cập nhật và sau đó tìm thấy chúng trong dự án và xóa chúng một lần nữa.
Stan

FYI, nếu cần một mật khẩu lật đổ ở đây là cú pháp: trạng thái svn - tên người dùng user_name_here --password password_here | ? {$ _ -match '^! \ S + (. *)'} | % {svn rm $ Các trận đấu [1] - tên người dùng user_name_here - mật khẩu password_here}
Jeff

Đầu tiên bạn nên cam kết sau dòng này trước khi thực hiện svn up? bởi vì các tệp được khôi phục từ máy chủ svn
Pierre

Hành động này cũng sẽ xóa các tập tin khỏi kho lưu trữ?
Sebastián Ulloa

174

Nếu bạn đang sử dụng Mac ( Darwin ) hoặc Linux, bạn có thể chuyển các đầu ra của các lệnh sau sang svn rmcho tất cả các tệp bị thiếu. Bạn có thể đặt thư mục làm việc hiện tại thành thư mục hoặc thư mục con thích hợp trước khi chạy chúng - tùy thuộc vào việc bạn muốn chạy toàn bộ bản sao làm việc này hay chỉ một tập hợp con.

  1. Chạy trạng thái svn
  2. Tìm kiếm các dòng bắt đầu bằng "!" (còn thiếu)
  3. In "--force" (đối số svn) và cột thứ hai (tên tệp) của đầu ra từ # 2
  4. Chạy svn rmbằng cách sử dụng đầu ra của số 3 làm đối số

Vì vậy, lệnh đầy đủ là:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Người giới thiệu:


4
Điều này không hoạt động nếu có khoảng trắng trong tên tệp. Tôi không biết đủ awk để sửa nó, mặc dù.
bugloaf

2
Sử dụng awk '{print " --force "$2"@"}'nếu tên tệp của bạn chứa @(ví dụ: nếu bạn là nhà phát triển iOS)
Guillaume Algis

1
Và xử lý một tên tệp có khoảng trắng, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'nên thực hiện thủ thuật (và bắt đầu trông xấu xí)
Guillaume Algis

12
Lệnh đầy đủ chăm sóc không gian là "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" chất nền ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld

1
Tại sao bạn không đặt --forcephần xargs?
jwg

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Chỉ lọc trên các tệp bị thiếu
  3. Cắt bỏ dấu chấm than
  4. Lọc ra khoảng trắng dấu
  5. Thêm trích dẫn hàng đầu
  6. Thêm dấu ngoặc kép
  7. svn remove mỗi tập tin

Giải pháp này hoạt động nếu có khoảng trắng trong tệp / thư mục.
yuric

Làm thế nào để thêm một chi tiết cho điều này? xargs -verbose svn rm?
TekiusFanatikus

1
Chỉ là một gợi ý cho người dùng tập lệnh, v.v., lệnh này không thành công nếu không tìm thấy tệp nào để xóa: svn: E205001: Hãy thử 'svn trợ giúp xóa' để biết thêm thông tin svn: E205001: Không đủ đối số được cung cấp
Thorsten Schöning

1
Vấn đề của @ ThorstenSchöning có thể được khắc phục bằng cách thêm -rvào các xargstùy chọn (không chạy, nếu không có đối số nào được đưa ra). Thêm vào đó, numer của các đối số nên hạn chế và loại bỏ nên được trộn vì gọi không thành công với số lượng rất lớn các tập tin để loại bỏ, ví dụ -n 500. Và cuối cùng nhưng không kém phần quan trọng, trích dẫn được thực hiện là tối ưu cho các tệp có chứa đặc biệt shell như $- sử dụng tốt hơn \nlàm dấu phân cách và để lại trích dẫn cho xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

Cảm ơn Paul Martin cho phiên bản Windows.

Đây là một sửa đổi nhỏ cho tập lệnh để các tệp Windows có khoảng trắng cũng được tính đến. Ngoài ra các missing.listtập tin sẽ được gỡ bỏ vào cuối.

Tôi đã lưu các mục sau trong svndel.bat trong thư mục bin SVN của mình (được đặt trong môi trường %% PATH của tôi) để có thể gọi nó từ bất kỳ thư mục nào tại dấu nhắc lệnh.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

Rất vui khi thấy một số mã hàng loạt sáng tạo vẫn xuất hiện :)
user230910

Wow, câu trả lời tuyệt vời. Tôi đã định đi với powershell, nhưng điều này dễ dàng hơn nhiều.
Jim Andrakakis

Tôi đã thêm một dòng khác sau đó del missing.list 2>NUL, bởi vì tôi đã thêm tất cả các tệp mới trực tiếp sau lần đầu tiên xóa các tệp đã xóa để nó được thêm missing.listvào svn: svn delete "missing.list"làm việc cho tôi
Pierre

Tôi đã sửa đổi tập lệnh này để cố chạy từ một vị trí tùy ý và sau đó gặp phải sự cố stackoverflow.com/questions/1137219/ này để nó xuất hiện bạn PHẢI sử dụng Thư mục làm việc hiện tại để thực hiện hành động này.
aolszowka

7

Tôi thích tùy chọn PowerShell ... Nhưng đây là một tùy chọn khác nếu bạn đang sử dụng tập lệnh bó Windows:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

Một thay thế hoạt động trên Linux (bash) cho các tệp cần xóa không chứa các khoảng trắng trong đường dẫn:

svn xóa `svn status | grep! | awk '{in $ 2}' `

4

Kịch bản shell này, kiểm tra đệ quy các thư mục ( svn status) trong dự án của bạn, loại bỏ các tệp bị thiếu (như yêu cầu câu hỏi) thêm các tệp mới vào kho lưu trữ. Nó là một loại "lưu trữ vào kho lưu trữ ảnh chụp nhanh hiện tại của dự án".

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done

4

Một sửa đổi nhỏ của dòng lệnh, hoạt động trên Mac OS (hy vọng ngay cả trên Linux) và đối phó với các tệp báo cáo lệnh "svm sr", như "! M" (thiếu và sửa đổi).

Nó đối phó với không gian trong các tập tin.

Nó dựa trên sự sửa đổi của một câu trả lời trước đó:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

Thực sự có thể xóa hoàn toàn missing.listkhỏi user3689460 và Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

để tham khảo - đây là DOS / cmd.exe trong cửa sổ đất
user230910

2

Khi xử lý nhiều tệp, có thể xảy ra rằng đầu vào đối số cho xargs đang trở nên quá dài. Tôi đã đi cho một thực hiện ngây thơ hơn mà cũng làm việc trong trường hợp đó.

Cái này dành cho Linux:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

1

Phiên bản cải tiến

Vì vậy, lệnh đầy đủ là:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
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.