2011-08-05 4 views
21

Tôi đoán tôi đã bất cẩn.Thêm tệp vào SVN rồi xóa trước cam kết

Tôi đã thêm một loạt tệp vào svn với svn add, sau đó tôi thấy một vài tệp được thêm vào mà tôi không muốn vì vậy tôi đã xóa chúng với rm.

Bây giờ tôi không thể cam kết nữa vì cam kết thiếu tệp. Tôi đã thử svn dọn dẹp nhưng nó không giúp đỡ.

Tùy chọn làm việc của tôi bây giờ là xóa thủ công mọi thư mục .svn nhưng điều đó có vẻ sai.

+4

Bạn có thể 'svn hoàn nguyên các tệp đã thêm. –

+0

Tin tôi đi, bạn không bất cẩn. Svn thực sự nên chăm sóc điều này cho bạn, nhưng nó không phải lúc nào cũng thông minh. – trysis

Trả lời

37

Theo tôi được biết bạn có tình trạng này:

$ touch foo 
$ svn add foo 
A   foo 
$ rm foo 
$ svn ci 
svn: Commit failed (details follow): 
svn: 'foo' is scheduled for addition, but is missing 

Vì vậy, để khắc phục nó làm điều này: (! Cảm ơn Linus)

$ svn revert foo 
Reverted 'foo' 

hoặc bạn có thể làm điều này:

$ touch foo 
$ svn delete --force foo 

cho mỗi tệp và bạn sẽ có thể đăng ký mà không gặp sự cố nào.

+1

Không nhận ra điều này thực sự đã xóa chính tệp đó, không chỉ theo dõi SVN. Lưu ý rằng điều này cũng loại bỏ tệp khỏi thư mục cục bộ. –

1

Nếu bạn svn add X một tệp nhưng bạn chưa cam kết, thì sau đó bạn quyết định bạn muốn xóa tệp đó (và không cam kết); bạn chỉ cần hoàn nguyên bạn svn add X lệnh với svn revert X.

Sau đó, nó sẽ "hoàn tác" bổ sung chưa được cam kết.

5

Nếu bạn đã thêm thư mục có thư mục con và tệp trong thì bạn đã xóa thư mục trước khi bạn cam kết. Trong trường hợp này, bạn có thể làm như sau.

$ svn revert <Deleted Folder Name> --depth infinity 
+0

Tôi gặp lỗi: ** không tìm thấy nút ** –

2

Nếu bạn có nhiều thư mục với nhiều tập tin đã xóa, lệnh sau đây có thể giúp:

svn st | grep '!M' | sed 's/!M  \(.*\)$/"\1"/' | xargs svn revert 

Tôi khuyên bạn nên đầu tiên vào danh sách các tập tin được sẽ được hoàn nguyên. Chúng ta có thể làm điều đó bằng cách loại bỏ đường ống cuối cùng: svn st | grep '!M' | sed 's/!M \(.*\)$/"\1"/'.

Từng lệnh bước giải thích:

  • svn st - Nó liệt kê thêm và không hợp lý xóa file với !M biểu tượng
  • grep '!M' Nó tìm thấy các dòng với !M
  • sed 's/!M \(.*\)$/"\1"/' này được sử dụng để thoát khỏi của các !M với các không gian. Nó cũng sẽ trích dẫn các tên tập tin, do đó bạn không phải lo lắng nếu các tập tin bao gồm các khoảng trống trên chúng.
  • xargs svn revert Điều này sẽ hoàn nguyên tất cả các tệp được liệt kê.
+0

Bạn có thể giải thích thêm câu trả lời của mình để thêm mô tả chi tiết hơn về giải pháp bạn cung cấp không? – abarisone

+1

** Câu hỏi này đã gần ba tuổi. ** Ngoài ra, sẽ rất hữu ích nếu bạn xây dựng câu trả lời của mình thêm một chút nữa. Cũng lưu ý rằng đầu ra của 'svn st' có thể thay đổi mà không cần thông báo mà sẽ làm cho giải pháp của bạn vô ích ... –

3

Đây thực sự là phiên bản sửa đổi hơi của @Gonzalo Mateo, giải quyết được sự cố của tôi.

svn st | grep '!' | sed 's/!M  \(.*\)$/"\1"/' | xargs svn revert --depth infinity 
+0

Điều này giải quyết được vấn đề của tôi. Cảm ơn. –

0

này giải quyết vấn đề của tôi

svn st | grep '!' | sed 's/!M \(.*\)$/"\1"/' | xargs svn revert --depth infinity

Một điều bạn nên lưu ý là các mã trên chỉ hoạt động cho những bổ sung mới nhất. Vì vậy, hãy thực hiện một số khác svn ci nếu có lỗi, sau đó chạy lại mã trên. Sau đó, một lần nữa svn ci cho đến khi bạn đã hoàn nguyên mọi vấn đề.

Bonus: Thêm một bí danh (điều này là dành cho Oh-My-ZSH Zsh Shell)

# SVN revert everything like reset hard alias sra="svn st | grep '!' | sed 's/!M \(.*\)$/"\1"/' | xargs svn revert --depth infinity"

Bây giờ sra ví dụ SVN Revert Tất cả sẽ làm cho cuộc sống của bạn dễ dàng.