Làm cách nào để thoát @ ký tự trong tên tệp được quản lý Subversion?


191

Đối với nhiều hoạt động Subversion, việc thêm biểu tượng '@' vào cuối tệp hoặc đối số URL cho phép bạn nhắm mục tiêu sửa đổi cụ thể của tệp đó. Ví dụ: "thông tin svn test.txt@1234" sẽ cung cấp thông tin về test.txt như đã tồn tại trong phiên bản 1234.

Tuy nhiên, khi tên của tệp chứa @, nó được Subversion hiểu không chính xác như một công cụ xác định sửa đổi:

thông tin svn 'test @ .txt' svn: Lỗi cú pháp phân tích cú pháp sửa đổi '.txt'

Tôi đã thử các trích dẫn kép và đơn cũng như thoát với '/', '\' và '@'. Làm cách nào tôi có thể nói với Subversion để coi các ký hiệu @ là một phần của tên tệp?


3
Tại sao bạn có tên tập tin với @ trong đó? Hỏi về rắc rối, nếu bạn hỏi tôi ... :-)
JesperE

Câu hỏi rất hay! :) Tôi đang đảm nhận một dự án trong đó nhân vật này là một thành phần cơ bản của các quy ước đặt tên tệp và thật không may, điều này không thể thay đổi trong tương lai gần.
weston

57
Apple đã tạo ra quy ước này cho tất cả các nhà phát triển iOS kể từ iOS 4+. Tất cả tài sản nên được đặt tên @ 2x nếu chúng dành cho màn hình độ phân giải cao ...
Dimitris

2
Tiêu chuẩn cho ghetto kiểu cũ Matlab OO
Chinasaur

Ngoài ra, nếu bạn lưu khóa riêng hoặc khóa thu hồi từ Enigmail của Thunderbird, nó sẽ tạo một tên tệp - không phải là không có lý, được cung cấp cho ứng dụng - có chứa một dấu hiệu
Peter Flynn

Câu trả lời:


283

Từ sách SVN (nhấn mạnh thêm):

Người đọc nhận thức có lẽ đang tự hỏi tại thời điểm này liệu cú pháp sửa đổi chốt có gây ra vấn đề cho các đường dẫn sao chép hoặc URL thực sự có dấu hiệu trong đó không. Rốt cuộc, làm thế nào để svn biết liệu news@11tên của một thư mục trong cây của tôi hay chỉ là một cú pháp cho phiên bản 11 của bản tin ? Rất may, trong khi svn sẽ luôn giả định sau này, có một cách giải quyết tầm thường. Bạn chỉ cần nối một dấu ở cuối đường dẫn , chẳng hạn như news@11@. svn chỉ quan tâm đến lần cuối cùng trong dấu hiệu trong đối số và không được coi là bất hợp pháp khi bỏ qua một công cụ xác định sửa đổi chốt theo nghĩa đen sau đó tại dấu hiệu đó. Cách giải quyết này thậm chí áp dụng cho các đường dẫn kết thúc bằng dấu hiệu mà bạn sẽ sử dụngfilename@@để nói về một tập tin có tên filename @ .


4
Lưu ý rằng để sử dụng "svn diff", bạn cần thêm tham số sửa đổi. "svn up @ file @" hoạt động, nhưng "svn diff @ file @" không hoạt động. Bạn cần sử dụng "svn diff -r HEAD @ file @"
analytik

Lưu ý cho sách SVN: các tệp có thể tồn tại mà không cần tiện ích mở rộng, ngay cả trên Windows, vì vậy news@11cũng có thể là một tệp.
phân ly

1
Lưu ý rằng đối với một số lệnh, như đổi tên, đối số có thể là mục được phiên bản hoặc tên tệp cục bộ. Trong trường hợp đổi tên, mục tiêu cũng được quét để sửa đổi được ghim, nhưng sau đó nó có thể được coi là một tên đơn giản. Ví dụ, nếu bạn muốn đổi tên @foothành @bar, svn rename @foo@ @barsẽ phàn nàn về @bar; Nhưng nếu bạn thực hiện nó svn rename @foo@ @bar@, tên mới sẽ theo nghĩa đen @bar@. Để tránh điều này, hãy thêm ./(hoặc .\ trên các cửa sổ) để làm cho nó rõ ràng là một đường dẫn cục bộ : svn rename @foo@ ./@bar.
Zastai

82

Câu trả lời ban đầu là chính xác, nhưng có lẽ không đủ rõ ràng. Các tùy chọn dòng lệnh unix cụ thể như sau:

svn info 'image@2x.png@'

hoặc là

svn info "image@2x.png@"

hoặc là

svn info image\@2x.png\@

Tôi vừa kiểm tra cả ba.


4
Tôi cũng đã thử nghiệm svn info icon@2x.png@và nó cũng hoạt động. Có, không có dấu ngoặc kép hoặc dấu gạch chéo!
Nate

Sự cần thiết để trích dẫn phụ thuộc vào trình bao của bạn - Tôi sử dụng KSH và chắc chắn bạn cần báo giá (vì '@' là dấu hiệu bạn muốn một quy trình chạy trong nền). YMMV tùy thuộc vào vỏ.
David H

Vâng. Số dặm của tôi là trên bashđường cao tốc :)
Nate

1
@Nate Bây giờ tôi không thể làm cho nó thất bại - nó hoạt động tốt mà không có dấu ngoặc kép trong ksh. Tôi không biết tại sao tôi nghĩ tôi cần chúng - có thể là một số vấn đề khác - đó là 2 năm trước tôi đã đăng bài này ...
David H

14

Giải pháp để thêm nhiều tệp trong các thư mục con khác nhau:

for file in $(find ./ -type f -name "*@*.png"); do svn add $file@; done

Chỉ cần thay thế "png" trong " @ .png" thành loại tệp bạn muốn thêm.


hãy chắc chắn trích dẫn hoặc thoát tên tệp của bạn (và thực hiện khớp không phân biệt chữ hoa chữ thường). Ngoài ra, không cần phải coi các tệp có @tên của họ là trường hợp đặc biệt, bạn có thể gắn @biểu tượng một cách an toàn vào tất cả các tên tệp : for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. Ngoài ra, cách tiếp cận này không để lại repo svn của bạn với cấu trúc tệp / thư mục không phù hợp với bản sao cục bộ đang hoạt động?
ardew

sử dụng exec tìm kiếm có thể là háo hức hơn:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung

11

để thêm tệp sau: image@2x.png làm như sau: svn thêm hình ảnh \ @ 2x.png @


11

Đơn giản chỉ cần thêm

@

tại tệp bạn cần sử dụng, bất kể đó là lệnh SVN nào, vd:

file@2x.jpg

đến

file@2x.jpg@

8

Trong trường hợp của tôi, tôi cần xóa các tệp khỏi repo SVN có dấu @:

Điều này sẽ không hoạt động:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png'

Nhưng điều này đã làm:

svn remove 'src/assets/images/hi_res/locales-usa@2x.png@'

6

Để thêm nhiều tệp, có giải pháp thay thế:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add

Hãy giải thích câu trả lời của bạn.
Hemang

3
Bạn có thể sử dụng awk thay vì grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi

1

Đối với các lệnh svn với 2 đối số như "di chuyển", bạn phải thêm "@" chỉ ở bên trái (đầu tiên) tham số. Ví dụ:

$ svn add README@txt@
A         README@txt

$ svn move README@txt@ README2@txt
A         README2@txt
D         README@txt


$ svn status
A       README2@txt

$ svn commit -m "blah"
Adding         README2@txt
Transmitting file data .
Committed revision 168.

$ svn delete README2@txt@
D         README2@txt

$ svn commit -m "blahblah"
*Deleting       README2@txt

Committed revision 169.

Dòng này rất quan trọng: $ svn di chuyển README @ txt @ README2 @ txt

Như bạn có thể thấy, chúng tôi không cần phải thêm "@" tại "README2 @ txt"


0

@David H

Tôi vừa thử một lệnh tương tự mà không thoát khỏi các ký hiệu @ và nó vẫn hoạt động tốt

svn ci splash.png splash@2x.png@

Đây là trên GNU bash, phiên bản 3.2.48 (1) -release (x86_64-apple-darwin10.0) và svn 1.6.16


0

Giải pháp duy nhất hiệu quả với tôi là cùng được đề xuất bởi @NPike

svn hoàn nguyên 'đường dẫn / đến / tên tệp @ ext @'


Bạn có chắc chắn rằng đây sẽ là một câu trả lời mới cho câu hỏi ban đầu? Điều này đúng hơn nên là một upvote hoặc bình luận
Nico Haase

xin lỗi, xấu của tôi, tôi chưa thể thêm nhận xét nào
Jonyx4

0

Hôm nay tôi gặp vấn đề với tên tệp được tạo từ địa chỉ email (không phải là ý kiến ​​hay!).

Giải pháp, sử dụng printfcác tùy chọn findvà mở rộng vỏ

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
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.