2011-01-05 30 views
44

Tôi có một kịch bản trong đó tôi thêm tất cả các file mới trước khi cam kết bản sao làm việc của tôi để kho của tôi với dòng này:Cách xóa tất cả các tệp đã xóa khỏi kho lưu trữ?

svn status | grep ^\? | awk '{print $2}' | xargs svn add 

bây giờ tôi muốn thêm một dòng mà xóa từ kho lưu trữ tất cả các tập tin đã xóa trong làm việc của tôi sao chép. Nói cách khác, tôi không thể xác định chúng từng cái một, và tôi cần phát hiện chúng với trạng thái svn và sau đó tự động loại bỏ chúng. Tuy nhiên, dòng này không hoạt động.

svn status | grep ^\! | awk '{print $2}' | xargs svn --force delete 

Như bạn có thể thấy tôi đã thay thế

"?" với "!" và

"add" với "--force delete"

Ông có thể cho tôi biết tại sao nó doesn' t làm việc?

ps. Tôi biết đó là một thủ tục mạo hiểm. Tôi đã thảo luận tất cả về nó. cảm ơn

cảm ơn

+0

Bạn đã thử chưa? Tại sao không làm điều đó cho mình thay vì chờ đợi một câu trả lời? – viraptor

+0

@ viraptor Tôi vừa thử, nó không hoạt động – aneuryzm

+0

Vấn đề là bạn đang cố gắng xóa các tệp được đánh dấu bằng dấu chấm than có nghĩa là đã xảy ra sự cố. Điều này có nghĩa là bạn đã xóa tập tin đó bằng lệnh vận hành hệ thống thay vì svn xóa mà SVN không thích ...... Vấn đề tôi không hiểu ... làm thế nào bạn đã thực hiện xóa các tập tin mà bây giờ bạn muốn để thực hiện vĩnh viễn bởi svn rm --force? – khmarbaise

Trả lời

59

Tôi vừa thử tính năng này và hoạt động hoàn hảo.

$ svn st | grep '^!' | awk '{print $2}' | xargs svn delete --force 
D   groups.pl 
D   textblock.pl 

Tệp của bạn có dấu cách trong tên không?

WAIT A SECOND !! Tôi thấy sự cố. Bạn có:

svn --force delete 

và không:

svn delete --force 

Các --force là một tham số của lệnh delete và không phải là lệnh svn.

+0

Tôi có câu hỏi về nó. Nếu tôi xóa một tệp, tôi có xóa tất cả các phiên bản trước không? Nói cách khác, tôi không thể hoàn nguyên nó nữa phải không? Vì vậy, tất cả các cam kết trước đó cũng bị xóa? – aneuryzm

+0

Nó vẫn không hoạt động ... nhưng tôi nghĩ vào thời điểm này để sử dụng một công cụ như rsync để sao lưu các tệp của tôi (nhận xét này không đúng, nhưng tôi nhận ra mình không thể sử dụng svn như thế này) – aneuryzm

+1

Có, bạn có thể truy xuất tệp đã bị xóa. Bạn cần tìm bản sửa đổi của thư mục với tệp bạn đã xóa và sử dụng ghim sửa đổi ("@" ở cuối URL). Từ đó, bạn có thể sao chép tệp bị thiếu sang bản sửa đổi hiện tại. Bạn cũng có thể thực hiện hợp nhất ngược lại để hoàn tác tất cả các thay đổi của mình. Trong thực tế, một trong những khiếu nại về svn là bạn không thể xóa hoàn toàn (xóa) một tập tin trong trường hợp bạn đã cam kết một tập tin mà bạn không cho là (như mật khẩu của bạn). –

2

gì về việc thêm bạn chỉ có thể sử dụng

svn add --force . 

hoặc

svn --force add . 

nó sẽ làm điều tương tự: thêm tất cả các file không phiên bản ngoại trừ những người phù hợp với svn: ignore mẫu

+0

Kịch bản lệnh OP hoạt động đệ quy - phương pháp này không. – Mortoc

+3

tại sao? Tôi đã kiểm tra nó, nó hoạt động đệ quy – sdespolit

40

Tôi đã tìm thấy một giải pháp khác nữa.

svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm % 

Tôi đã thấy nó trên http://donunix.blogspot.de/2009/02/svn-remove-all-deleted-files.html

+1

Điều này thật tuyệt vời và hoạt động hoàn hảo. –

+3

Cảm ơn! nó hoạt động ngay cả với không gian trong tên tập tin :) –

+1

! Tuyệt vời. Giải quyết không gian của tôi trong vấn đề tên chi tiêu. – WernerCD

2

một cách tiếp cận sử dụng một oneliner perl sẽ là:

svn st | perl -ne 'print "$1\n" if /^\!\s+(.*)/' | xargs svn rm 

này cũng nên làm việc với các nhân vật không gian trong tên tập tin.

chỉnh sửa: cải thiện regexp

5
svn status | grep '^!' | sed 's/! *//' | xargs -d '\n' svn delete --force 

Các giải pháp làm việc cho tên tập tin với không gian và ký tự đặc biệt.

  • svn status - liệt kê tất cả những thay đổi, xóa các tập tin được đánh dấu là !
  • grep '^!' - chiết xuất dòng bắt đầu với ! (tức là xóa file)
  • sed 's/! *//' - loại bỏ ! -char ngay từ đầu và không gian sau nó
  • xargs -d '\n' - xử lý mọi dòng nhập (bao gồm dấu cách và ký tự đặc biệt) làm đối số riêng biệt và chuyển chúng đến svn delete --force
+0

FYI tùy chọn '-d' của' xargs' không được hỗ trợ trên OS X - vì vậy dường như chỉ hoạt động với Linux (hoặc tôi thiếu gì đó?) – HughHughTeotl

+0

Được thăng hạng cho '-d '\ n'' Tùy chọn! – Mitchapp

Các vấn đề liên quan