Bagaimana cara menghindari @ karakter dalam nama file yang dikelola Subversion?

191

Untuk banyak operasi Subversi, menambahkan simbol '@' di akhir file atau argumen URL memungkinkan Anda untuk menargetkan revisi tertentu dari file itu. Misalnya, "info svn test.txt@1234" akan memberikan informasi tentang test.txt seperti yang ada di revisi 1234.

Namun, ketika nama file berisi @, itu ditafsirkan secara salah oleh Subversion sebagai specifier revisi:

info svn 'test @ .txt' svn: Sintaks kesalahan penguraian revisi '.txt'

Saya sudah mencoba tanda kutip ganda dan tunggal serta melarikan diri dengan '/', '\', dan '@'. Bagaimana saya bisa memberi tahu Subversion untuk memperlakukan simbol @ sebagai bagian dari nama file?

Weston
sumber
3
Kenapa Anda memiliki nama file dengan @ di dalamnya? Meminta masalah, jika Anda bertanya kepada saya ... :-)
JesperE
Pertanyaan yang sangat bagus :) Saya mengambil alih sebuah proyek di mana karakter ini adalah komponen mendasar dari konvensi penamaan file dan sayangnya ini tidak dapat diubah dalam waktu dekat.
weston
57
Apple membuat konvensi ini untuk semua pengembang iOS pada iOS 4+. Semua aset harus diberi nama @ 2x jika itu untuk tampilan beresolusi tinggi ...
Dimitris
2
Standar untuk ghetto gaya lama Matlab OO
Chinasaur
Juga, jika Anda menyimpan kunci pribadi atau kunci pencabutan dari Thunderbird's Enigmail, itu akan membuat nama file - bukan tanpa alasan, mengingat aplikasi tersebut - yang berisi tanda saat
Peter Flynn

Jawaban:

283

Dari buku SVN (penekanan ditambahkan):

Pembaca perseptif mungkin bertanya-tanya pada titik ini apakah sintaks revisi pasak menyebabkan masalah untuk bekerja jalur salin atau URL yang benar-benar memiliki tanda-tanda di dalamnya. Lagi pula, bagaimana svn tahu apakah news@11nama direktori di pohon saya atau hanya sebuah sintaks untuk "revisi 11 berita "? Untungnya, sementara svn akan selalu menganggap yang terakhir, ada solusi sepele. Anda hanya perlu menambahkan tanda pada ke ujung jalan , seperti news@11@. svn hanya peduli tentang tanda terakhir pada argumen, dan tidak dianggap ilegal untuk menghapus specifier revisi pasak literal setelah tanda tersebut. Solusi ini bahkan berlaku untuk jalur yang berakhir pada tanda at — Anda akan gunakanfilename@@untuk berbicara tentang file bernama filename @ .

Rob Kennedy
sumber
4
Perhatikan bahwa untuk menggunakan "svn diff" Anda perlu menambahkan parameter revisi. "svn up @ file @" berfungsi, tetapi "svn diff @ file @" tidak berfungsi. Anda perlu menggunakan "svn diff -r HEAD @ file @"
analytik
Catatan untuk buku SVN: file dapat ada tanpa ekstensi, bahkan di Windows, jadi news@11bisa juga file.
trysis
1
Perhatikan bahwa untuk beberapa perintah, seperti mengganti nama, argumen dapat berupa item berversi atau nama file lokal. Dalam hal mengganti nama, target juga akan dipindai untuk revisi yang disematkan, tetapi kemudian mungkin diperlakukan sebagai nama biasa. Misalnya, jika Anda ingin mengubah nama @foountuk @bar, svn rename @foo@ @barakan mengeluh tentang @bar; tetapi jika Anda berhasil svn rename @foo@ @bar@, nama baru akan secara harfiah @bar@. Untuk menghindari hal ini, tambahkan ./(atau .\ pada windows) untuk membuatnya jelas itu adalah jalan lokal: svn rename @foo@ ./@bar.
Zastai
82

Jawaban aslinya benar, tetapi mungkin tidak cukup eksplisit. Opsi baris perintah unix tertentu adalah sebagai berikut:

svn info '[email protected]@'

atau

svn info "[email protected]@"

atau

svn info image\@2x.png\@

Saya baru saja menguji ketiganya.

David H
sumber
4
Saya juga menguji svn info [email protected]@dan berhasil juga. Ya, tidak ada kutipan atau garis miring!
Nate
Kebutuhan untuk mengutip tergantung pada shell Anda - Saya menggunakan KSH dan pasti Anda membutuhkan tanda kutip (karena '@' adalah tanda Anda ingin proses berjalan di latar belakang). YMMV tergantung pada shell.
David H
Ya. Jarak tempuh saya berada di bashjalan raya :)
Nate
1
@Nate Sekarang saya tidak bisa membuatnya gagal - itu berfungsi dengan baik tanpa tanda kutip di ksh. Saya tidak tahu mengapa saya pikir saya membutuhkannya - mungkin beberapa masalah lain - 2 tahun yang lalu saya memposting ini ...
David H
14

Solusi untuk menambahkan banyak file dalam berbagai sub-folder:

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

Cukup ganti "png" di " @ .png" dengan jenis file yang ingin Anda tambahkan.

Lcsky
sumber
pastikan untuk mengutip atau keluar dari nama file Anda (dan lakukan pencocokan case-sensitive). juga tidak perlu ke file memperlakukan dengan @nama mereka sebagai kasus khusus, Anda dapat dengan aman menambahkan @simbol ke semua nama file: for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; done. juga, bukankah pendekatan ini membuat repo svn Anda dengan struktur file / direktori tidak konsisten dengan copy lokal yang berfungsi?
ardnew
penggunaan execfind mungkin lebih mudah:find . -type f -name "*@*.png" -exec svn add {}@ \;
Walty Yeung
11

untuk menambahkan file berikut: [email protected] lakukan hal berikut: svn add image \ @ 2x.png @

Malek Belkahla
sumber
8

Dalam kasus saya, saya perlu menghapus file dari repo SVN yang berisi tanda @:

Ini tidak akan berhasil:

svn remove 'src/assets/images/hi_res/[email protected]'

Tapi ini berhasil:

svn remove 'src/assets/images/hi_res/[email protected]@'
NPike
sumber
6

Untuk menambahkan banyak file, ada solusi alternatif:

svn status | grep \.png | awk '{print $2"@"}'| xargs svn add
liruqi
sumber
Tolong jelaskan jawaban Anda.
Hemang
3
Anda dapat menggunakan awk alih-alih grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi
1

Untuk perintah svn dengan 2 argumen seperti "bergerak", Anda harus menambahkan "@" hanya pada parameter kiri (pertama). Sebagai contoh:

$ 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.

Baris ini penting: $ svn pindahkan README @ txt @ README2 @ txt

Seperti yang Anda lihat, kita tidak perlu menambahkan "@" di "README2 @ txt"

Srdjan
sumber
0

@ David H

Saya baru saja mencoba perintah serupa tanpa keluar dari simbol @ dan masih berfungsi dengan baik

svn ci splash.png [email protected]@

Ini ada di GNU bash, versi 3.2.48 (1) -release (x86_64-apple-darwin10.0) dan svn 1.6.16

Qazzian
sumber
0

Satu-satunya solusi yang bekerja untuk saya adalah sama dengan yang disarankan oleh @NPike

svn kembalikan 'path / ke / filename @ ext @'

Jonyx4
sumber
Apakah Anda yakin ini harus menjadi respons baru terhadap pertanyaan awal? Ini seharusnya menjadi komentar atau komentar yang lebih baik
Nico Haase
maaf, salah saya, saya belum bisa menambahkan komentar
Jonyx4
0

Saya punya masalah hari ini dengan nama file yang dihasilkan dari alamat email (bukan ide yang sangat bagus!).

Solusi, menggunakan printfopsi find, dan ekspansi shell

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
Michel Billaud
sumber