Làm cách nào tôi có thể xóa tất cả các tệp / thư mục không được đảo ngược / bị bỏ qua trong bản sao làm việc của mình?


136

Nếu tôi có một bản sao hoạt động của kho lưu trữ Subversion, có cách nào để xóa tất cả các tệp không được đảo ngược hoặc bị bỏ qua trong bản sao làm việc đó bằng một lệnh hoặc công cụ không? Về cơ bản, tôi đang tìm kiếm tương tự SVN git clean.

Một dòng lệnh hoặc giải pháp GUI (cho TortoiseSVN) sẽ được chấp nhận.


Câu trả lời:


98

Sử dụng TortoiseSVN:

  • nhấp chuột phải vào thư mục sao chép làm việc, trong khi giữ phím shift
  • chọn "xóa các mục không đảo ngược"

7
Tính năng tốt đẹp! Tuy nhiên, tôi đã phải đọc liên kết để tìm ra rằng nó chỉ hoạt động trên chế độ xem danh sách (không phải chế độ xem dạng cây) trên XP - có lẽ bạn nên đưa nó vào câu trả lời của mình.
Nick Meyer

5
Có phải phiên bản dòng lệnh của svn (cụ thể trên windows) không cung cấp chức năng tương tự?
blong

3
Như sombody chỉ ra dưới đây:svn cleanup --remove-unversioned --remove-ignored .
haui

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Điều này có các tính năng sau:

  • Cả hai tập tin bị bỏ qua và không bị theo dõi đều bị xóa
  • Nó hoạt động ngay cả khi tên tệp chứa khoảng trắng (ngoại trừ dòng mới, nhưng không có nhiều thứ có thể được thực hiện ngoài việc sử dụng --xmltùy chọn và phân tích kết quả xml kết quả)
  • Nó hoạt động ngay cả khi svn statusin các ký tự trạng thái khác trước tên tệp (không nên vì các tệp không được theo dõi, nhưng chỉ trong trường hợp ...)
  • Nó nên hoạt động trên mọi hệ thống tuân thủ POSIX

Tôi sử dụng một tập lệnh shell có tên svncleannhư sau:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

2
Chính xác những gì tôi đang tìm kiếm, hoạt động như một sự quyến rũ cũng trên linux và MacOS!
giàu

Bạn có cần thiết lập lại IFS không? Tôi đã chọn không tạo tập lệnh 'svnclean'. Vì vậy, tôi tự hỏi nếu điều đó sẽ làm
hỏng

3
@matrixugly: Không, bạn không cần phải thay đổi IFSlại những gì trước đây. Khi bạn làm VARNAME=value command, phân công valueđể VARNAMEchỉ áp dụng trong quá trình thực command(với một số ngoại lệ mà không áp dụng cho read). Xem thông số kỹ thuật POSIXbáo cáo lỗi POSIX này để biết thêm chi tiết.
Richard Hansen

@rich, cảm ơn vì đã chia sẻ cái này Đã tìm kiếm một giải pháp dọn dẹp svn một vài năm trước, và cũng bỏ đi với một số kiến ​​thức kịch bản shell! Rõ ràng là tôi đã trở lại câu trả lời này khá nhiều.
C. Tewalt

120

Tôi biết điều này đã cũ nhưng trong trường hợp có ai khác vấp phải nó, các phiên bản mới hơn (1.9 trở lên) của hỗ trợ svn --remove-unversioned, vd svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
Đối với tôi, đây là câu trả lời đúng. Đó là một câu trả lời dòng lệnh đa nền tảng. Ngoài ra, bạn có thể xóa các tệp bị bỏ qua vớisvn cleanup . --remove-ignored
Dan Atkinson

1
Hoạt động trong svn 1.6 trở lên.
wegry

2
Vui lòng đổi nó thành 1.9, xem thêm subversion.apache.org/docs/release-notes/1.9.html (Tôi đã thử tại địa phương và nó không hoạt động, và tôi vào ngày 1.8.8)
ikku100

2
Có vẻ như vấn đề là nó không xóa các thư mục không được đảo ngược .
Nyerguds

1
@Nyerguds: Đúng, điều này không xóa các thư mục chưa được phiên bản mà chỉ xóa các tệp chưa được phiên bản. Có ai tìm ra giải pháp không?
dhiraj suvarna

42

Oneliner này có thể giúp bạn:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Sử dụng cẩn thận!


13
điều này không xóa các tệp bị bỏ qua và sẽ phá vỡ nếu tên tệp chứa khoảng trắng
Richard Hansen

1
Nó cũng không xóa các tập tin bị bỏ qua
plaisthos

4
Bạn có thể sử dụng svn status --no-ignoređể chụp tốt các tập tin bị bỏ qua.
Codure

3
Trong thực tế, tôi coi đó là một tính năng để đặt tại chỗ các tệp bị bỏ qua, tùy ý.
macetw

15

Sửa đổi câu trả lời của Yanal-Yves Fargialla và gimpf bằng cách sử dụng Powershell (nhưng không được phép nhận xét về bài đăng gốc của Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Điều này thêm carat ("^") để chỉ định bắt đầu dòng, tránh khớp tất cả các tệp có chứa chữ "i". Đồng thời thêm các cờ cho -recurse và -force để rm để làm cho lệnh này không tương tác và có thể sử dụng được trong một tập lệnh.


Lệnh cần thêm một trích dẫn kép ở cuối. Tôi chỉ cần thêm nó, nhưng các chỉnh sửa phải có ít nhất sáu ký tự.
Ian Miller

7

Nhiều điều trong SVN có thể được thực hiện theo nhiều cách khác nhau, bằng chứng là các câu trả lời dòng lệnh khác nhau được đưa ra ở đây. Với sự ra đời của phiên bản 1.7, trên thực tế, có một kỹ thuật khác dành cho TortoiseSVN, trên thực tế, cung cấp độ phân giải hạt mịn hơn câu trả lời của Stefan, cho phép bạn chọn các tệp không có phiên bản riêng biệt với các tệp bị bỏ qua. Chỉ cần chọn TortoiseSvn >> Clean up...để mở hộp thoại này.

Tùy chọn dọn dẹp Rùa


7

Với quyền hạn:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

Từ dòng lệnh:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"

3
Tôi thích kịch bản Windows thuần túy này! Tôi khuyên bạn nên sử dụng -match '[\?i]' -replace '^.{8}'thay thế, nó hoạt động chính xác ngay cả khi tên tệp bắt đầu bằng khoảng trắng và cũng xóa các tệp bị bỏ qua.
gimpf

1
Sử dụng tinh chỉnh được đề xuất của gimpf hoạt động tốt, nhưng tôi gặp phải trường hợp tôi gặp phải ItemNotFoundException. Hóa ra, chỉ có một tệp duy nhất trong tập kết quả trạng thái svn. Tinh chỉnh này khắc phục sự cố đó: code@ (trạng thái svn - không bỏ qua) -match '[\? I]' -replace '^. {8}' | rm `. Tìm ra nó với sự giúp đỡ từ bài đăng này
Dirtbird

1
và bởi vì điều đó sẽ nhắc bạn về các thư mục không có trong svn (vì recurse không được chỉ định), nên nó không tốt để sử dụng trong tập lệnh. Sử dụng:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Oneliner này hoạt động với tôi (dựa trên câu trả lời của Richard Hansen, điều đáng ngạc nhiên là không hoạt động đối với các tệp chứa khoảng trắng):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
để xóa các thư mục không đảo ngược quá, thêm -frvào rmlệnh: trạng thái svn - không bỏ qua | grep '^ [tôi?]' | cắt -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

Sử dụng TortoiseSVN:

  1. Nhấp chuột phải vào thư mục gốc của bản sao đang hoạt động và chọn TortoiseSVN -> "kiểm tra sửa đổi"
  2. Chọn "Hiển thị tệp bị bỏ qua"
  3. Sắp xếp theo cột "Trạng thái văn bản"
  4. cuộn đến các tệp "không phiên bản", bây giờ tất cả được nhóm lại với nhau; chọn tất cả và nhấp chuột phải -> xóa
  5. cuộn đến các tập tin "bị bỏ qua", bây giờ tất cả được nhóm lại với nhau; chọn tất cả và nhấp chuột phải -> xóa

Không thực sự là một giải pháp tốt và sạch, nhưng là cách nhanh nhất mà tôi biết (trên Windows).

Cảm ơn pkh cho tiền boa với các tập tin bị bỏ qua.


Tôi tin rằng điều này sẽ chỉ loại bỏ các tập tin không phiên bản. Các mặt hàng bị bỏ qua sẽ không bị ảnh hưởng.
Dirk Vollmar

2
Bạn không cần sử dụng đối thoại cam kết và bạn có thể nhận được các tệp bị bỏ qua: Nhấp chuột phải | RùaSVN | Kiểm tra sửa đổi. Sau đó, bạn có thể nhấp vào 'Hiển thị tệp bị bỏ qua' và sắp xếp / xóa một cách thích hợp.
pkh

4

Điều này tương tự với các câu trả lời khác, nhưng thực sự bị bỏ qua các tệp (lưu ý 'Tôi' trong REs):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
điều này sẽ phá vỡ nếu một tên tệp chứa khoảng trắng
Richard Hansen

4

Ai đó nói bạn không thể làm điều đó từ dòng lệnh Windows.

Bò đực.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Nó có trong một dòng và không yêu cầu một công cụ GNU. :)


for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas

@DarienPardinas, phiên bản của bạn đặc biệt hữu ích nếu cắm vào "Lệnh thực thi Windows" của Jenkins, mà tôi vừa học không phải là một dấu nhắc lệnh mà giống như một tập lệnh bó, do đó cần phải có %%hơn%
jxramos

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.