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.)
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.)
Câu trả lời:
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 rm
tê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.)
svn up
? bởi vì các tệp được khôi phục từ máy chủ svn
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 rm
cho 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.
svn rm
bằ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:
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)
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í)
--force
phần xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
mỗi tập tin-r
vào các xargs
tù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 \n
là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
Tôi vừa tìm thấy cái này, đây là một mẹo nhỏ, Loại bỏ tất cả các tập tin bị thiếu trong các bản sao của SVN khỏi bản sao làm việc của SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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.list
tậ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
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.list
vào svn: svn delete "missing.list"
làm việc cho tôi
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)
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) và 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
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
Thực sự có thể xóa hoàn toàn missing.list
khỏi user3689460 và Paul Martin
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
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