วิธีการหลีกเลี่ยงอักขระ @ ในชื่อไฟล์ที่ถูกโค่นล้ม?


191

สำหรับการโค่นล้มหลายครั้งการผนวกสัญลักษณ์ '@' ต่อท้ายไฟล์หรืออาร์กิวเมนต์ URL ช่วยให้คุณสามารถกำหนดเป้าหมายการแก้ไขเฉพาะของไฟล์นั้นได้ ตัวอย่างเช่น "svn info test.txt@1234" จะให้ข้อมูลเกี่ยวกับ test.txt ตามที่มีอยู่ในรุ่นที่แก้ไข 1234

อย่างไรก็ตามเมื่อชื่อของไฟล์มี @ มันจะถูกตีความอย่างไม่ถูกต้องโดยการโค่นล้มเป็นตัวระบุการแก้ไข:

ข้อมูล svn 'test @ .txt' svn: ข้อผิดพลาดทางไวยากรณ์ในการแยกวิเคราะห์การแก้ไข '.txt'

ฉันได้ลองใส่เครื่องหมายอัญประกาศคู่และเดี่ยวรวมถึงการหลีกเลี่ยงด้วย '/', '\' และ '@' ฉันจะบอกให้ Subversion ใช้สัญลักษณ์ @ เป็นส่วนหนึ่งของชื่อไฟล์ได้อย่างไร


3
ทำไมคุณถึงมีชื่อไฟล์ด้วย @ ในนั้น? ถามปัญหาถ้าคุณถามฉัน ... :-)
JesperE

คำถามที่ดีมาก! :) ฉันกำลังเข้ายึดโปรเจคที่ตัวละครนี้เป็นองค์ประกอบพื้นฐานของแบบแผนการตั้งชื่อไฟล์และน่าเสียดายที่ไม่สามารถเปลี่ยนแปลงได้ในอนาคตอันใกล้
weston

57
Apple สร้างระเบียบนี้สำหรับนักพัฒนา iOS ทุกคนตั้งแต่ iOS 4+ สินทรัพย์ทั้งหมดควรมีชื่อว่า @ 2x หากมีความละเอียดสูง ...
Dimitris

2
มาตรฐานสำหรับ Matlab แบบสลัมแบบเก่า OO
Chinasaur

นอกจากนี้หากคุณบันทึกคีย์ส่วนตัวหรือคีย์การเพิกถอนจาก Enigmail ของธันเดอร์เบิร์ดเบิร์ดมันจะสร้างชื่อไฟล์ - ไม่ไร้เหตุผลเนื่องจากแอปพลิเคชัน - มีเครื่องหมาย at
Peter Flynn

คำตอบ:


283

จากหนังสือ SVN (เน้นที่เพิ่ม):

ผู้อ่านเข้าใจผิดอาจสงสัยว่า ณ จุดนี้ว่าไวยากรณ์การแก้ไขหมุดทำให้เกิดปัญหาในการคัดลอกเส้นทางการทำงานหรือ URL ที่มีสัญญาณจริงหรือไม่ ท้ายที่สุดsvnจะรู้ได้อย่างไรว่าnews@11ชื่อของไดเรกทอรีในต้นไม้ของฉันหรือเพียงแค่ไวยากรณ์สำหรับ "การแก้ไข 11 ของข่าว "? โชคดีที่ในขณะที่svnจะรับหน้าที่หลังเสมอ แต่ก็มีวิธีแก้ปัญหาเล็กน้อย คุณต้องการเพียงผนวกที่สัญญาณไปยังจุดสิ้นสุดของเส้นทางnews@11@เช่น svnใส่ใจเฉพาะเกี่ยวกับคนสุดท้ายที่เข้าสู่ระบบในการโต้แย้งและมันก็ไม่ถือว่าผิดกฎหมายที่จะละเว้นตัวระบุการแก้ไขหมุดตัวอักษรหลังจากนั้นที่สัญญาณ วิธีแก้ปัญหานี้ใช้กับเส้นทางที่ลงท้ายด้วยเครื่องหมาย at - ซึ่งคุณจะใช้filename@@พูดคุยเกี่ยวกับไฟล์ชื่อชื่อไฟล์ @


4
โปรดทราบว่าสำหรับการใช้ "svn diff" คุณต้องเพิ่มพารามิเตอร์การแก้ไข "svn up @ file @" ใช้งานได้ แต่ "svn diff @ file @" ไม่ทำงาน คุณต้องใช้ "svn diff -r HEAD @ file @"
analytik

หมายเหตุสำหรับหนังสือ SVN: ไฟล์สามารถมีได้โดยไม่มีส่วนขยายแม้กระทั่งบน Windows ดังนั้นnews@11อาจเป็นไฟล์ได้เช่นกัน
trysis

1
โปรดทราบว่าสำหรับบางคำสั่งเช่นเปลี่ยนชื่ออาร์กิวเมนต์สามารถเป็นรายการเวอร์ชันหรือชื่อไฟล์โลคัล ในกรณีของการเปลี่ยนชื่อเป้าหมายจะได้รับการสแกนเพื่อแก้ไขที่ถูกตรึงไว้ แต่หลังจากนั้นอาจถือว่าเป็นชื่อธรรมดา ตัวอย่างเช่นถ้าคุณต้องการเปลี่ยนชื่อ@fooไป@bar, svn rename @foo@ @barจะบ่นเกี่ยวกับ@bar; แต่ถ้าคุณทำมันชื่อใหม่จะเป็นตัวอักษรsvn rename @foo@ @bar@ @bar@เพื่อหลีกเลี่ยงนี้เพิ่ม./(หรือ.\ ใน Windows) svn rename @foo@ ./@barเพื่อให้ชัดเจนว่ามันเป็นเส้นทางภายใน:
Zastai

82

คำตอบดั้งเดิมนั้นถูกต้อง แต่อาจไม่ชัดเจนเพียงพอ ตัวเลือกบรรทัดคำสั่งเฉพาะ unix มีดังนี้:

svn info 'image@2x.png@'

หรือ

svn info "image@2x.png@"

หรือ

svn info image\@2x.png\@

ฉันเพิ่งทดสอบทั้งสาม


4
ฉันยังได้ทดสอบsvn info icon@2x.png@และใช้งานได้เช่นกัน ใช่ไม่มีคำพูดหรือเครื่องหมายทับ!
เนท

ความจำเป็นในการอ้างอิงขึ้นอยู่กับเชลล์ของคุณ - ฉันใช้ KSH และแน่นอนว่าคุณต้องการอัญประกาศ (เนื่องจาก '@' เป็นสัญญาณที่คุณต้องการให้กระบวนการทำงานในพื้นหลัง) YMMV ขึ้นอยู่กับเปลือก
David H

อ๋อ ระยะทางของฉันอยู่บนbashทางหลวง :)
เนท

1
@Nate ตอนนี้ฉันไม่สามารถทำให้มันล้มเหลว - มันทำงานได้ดีโดยไม่ต้องใส่เครื่องหมายคำพูดเป็น ksh ฉันไม่รู้ว่าทำไมฉันถึงคิดว่าฉันต้องการพวกเขา - อาจเป็นปัญหาอื่น ๆ - เมื่อ 2 ปีที่แล้วฉันโพสต์สิ่งนี้ ...
David H

14

โซลูชันสำหรับการเพิ่มหลายไฟล์ในโฟลเดอร์ย่อยต่าง ๆ :

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

เพียงแทนที่ "png" ใน " @ .png" เป็นประเภทไฟล์ที่คุณต้องการเพิ่ม


อย่าลืมอ้างหรือหลีกเลี่ยงชื่อไฟล์ของคุณ (และทำการจับคู่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) นอกจากนี้ยังมีความจำเป็นในการรักษาไฟล์ที่ไม่มี@ชื่อของพวกเขาเป็นกรณีพิเศษคุณสามารถผนวกสัญลักษณ์บนชื่อไฟล์ทั้งหมด:@ for file in $(find ./ -type f -iname "*.png"); do svn add "$file@"; doneด้วยวิธีนี้ไม่ปล่อย repo svn ของคุณด้วยโครงสร้างไฟล์ / ไดเรกทอรีไม่สอดคล้องกับสำเนาทำงานท้องถิ่น
ardnew

โดยใช้execการค้นหาอาจจะ eaiser:find . -type f -name "*@*.png" -exec svn add {}@ \;
walty เหยิง


11

เพียงเพิ่ม

แอท

ที่ไฟล์ที่คุณต้องการใช้ไม่ว่าคำสั่ง SVN นั้นคืออะไรเช่น:

file@2x.jpg

ถึง

file@2x.jpg@

8

ในกรณีของฉันฉันต้องการลบไฟล์ออกจาก repo SVN ที่มีเครื่องหมาย @:

สิ่งนี้จะไม่ทำงาน:

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

แต่สิ่งนี้ทำ:

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

6

หากต้องการเพิ่มหลายไฟล์มีวิธีแก้ไขปัญหาอื่น:

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

กรุณาอธิบายคำตอบของคุณ
Hemang

3
คุณสามารถใช้ awk แทน grep:svn status | awk '/\.png/ {print $2"@"}'| xargs svn add
h3dkandi

1

สำหรับคำสั่ง SVN มี 2 ข้อโต้แย้งเช่น "ย้าย" คุณต้องผนวก "@" เท่านั้นที่ทิ้งไว้ (ตอนแรก) พารามิเตอร์ ตัวอย่างเช่น:

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

บรรทัดนี้สำคัญ: $ svn ย้าย README @ txt @ README2 @ txt

อย่างที่คุณเห็นเราไม่จำเป็นต้องผนวก "@" ที่ "README2 @ txt"


0

@ David H

ฉันลองคำสั่งที่คล้ายกันโดยไม่ต้องใช้สัญลักษณ์ @ และมันก็ยังทำงานได้ดี

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

นี่คือ GNU bash รุ่น 3.2.48 (1) - ปล่อย (x86_64-apple-darwin10.0) และ svn 1.6.16


0

วิธีแก้ปัญหาเดียวที่ใช้ได้ผลสำหรับฉันคือ @NPike ที่แนะนำแบบเดียวกัน

svn เปลี่ยน 'path / to / filename @ ext @'


คุณแน่ใจหรือว่านี่เป็นคำตอบใหม่สำหรับคำถามเดิม นี่ควรเป็น upvote หรือคอมเม้นต์แทน
Nico Haase

ขออภัยฉันไม่ดีฉันยังไม่สามารถเพิ่มความคิดเห็น
Jonyx4

0

วันนี้ฉันมีปัญหากับชื่อไฟล์ที่สร้างจากที่อยู่อีเมล (ไม่ใช่ความคิดที่ดีมาก!)

โซลูชันการใช้ printfตัวเลือกfindและการขยายเชลล์

 svn add  $(find . -name "*@*.png" -printf "%p@ ")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.