การคืนค่าไฟล์เดียวใน SVN เป็นการแก้ไขเฉพาะ


182

ฉันมีไฟล์ที่แสดงด้านล่างใน repo SVN ที่ฉันต้องการเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า วิธีการทำเช่นนี้ใน SVN คืออะไร? ฉันต้องการลดระดับไฟล์เฉพาะไฟล์นี้เป็นเวอร์ชันเก่าไม่ใช่ repo ทั้งหมด

ขอบคุณ

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

เมื่อคุณพูดย้อนกลับสิ่งที่คุณหมายถึงเมื่อ 7 ปีที่แล้วฮ่า ๆ
Kalpesh Soni

คำตอบ:


181

หากคุณต้องการไฟล์เก่าในสำเนาการทำงานของคุณ:

svn up -r 147 myfile.py

หากคุณต้องการย้อนกลับโปรดดู " วิธีกลับไปใช้โค้ดรุ่นเก่าของเราในเวอร์ชั่นโค่นล้ม "


8
แต่ครั้งต่อไปที่คุณอัปเดตมันจะได้รับไฟล์ที่คุณไม่ต้องการกลับมา ... : S
andygoestohollywood

2
หากคุณไม่ต้องการให้มันกลับมา svn ส่งไฟล์นั้นเพื่อนำเวอร์ชั่นที่คุณต้องการไปสู่ ​​repo
Packet Tracer

14
สิ่งนี้อาจไม่ได้ทำในสิ่งที่ผู้ถามต้องการ เมื่อใช้สิ่งนี้สำเนาการทำงานจะสะอาดและไม่สามารถยอมรับได้ตามที่เป็นอยู่และ "การอัปเดต svn" โดยไม่มีหมายเลขรุ่นที่ระบุจะเรียกคืนเวอร์ชันล่าสุดและไม่ต้องการ
CXJ

1
ฉันจะส่งคืนไฟล์ได้อย่างไร?
marcio

2
สิ่งนี้ค่อนข้างไม่ถูกต้องเนื่องจาก CXJ กล่าวถึงไม่มีวิธีการยอมรับไฟล์ที่อัปเดต คุณอาจต้องการทำเช่นเดียวกับ Mitch Dempsey พูดว่า (อย่างไรก็ตาม, - บังคับให้เขียนทับไฟล์): svn export --force -r 147 myfile.py myfile.py
avejidah

76

svn cat ใช้การแก้ไข arg ด้วยเช่นกัน!

svn cat -r 175 mydir/myfile > mydir/myfile


20
นี่คือคำตอบที่ดีที่สุดบนหน้าเว็บ มันปล่อยให้ไฟล์ที่เปลี่ยนแปลงในสถานะที่สามารถกระทำ
dotancohen

นี้ดูเหมือนจะไม่ทำงานเมื่อคุณกำลังวางเป็นไฟล์ใหม่
ahnbizcad

ฮ่าฮ่ามองย้อนกลับไป, idk บริบทที่ฉันคิดถึงเมื่อฉันโพสต์ ฉันจำไม่ได้ มันดูไร้สาระ
ahnbizcad

นี่เป็นเรื่องง่ายและตรงไปตรงมาเมื่อคุณต้องการยกเลิกการเปลี่ยนแปลงและรับไฟล์กลับสู่สถานะที่กระทำล่วงหน้าโดยไม่ต้องมีเทคนิคการควบคุมเวอร์ชันใด ๆ
ไม่ระบุชื่อ

57
svn revert filename 

สิ่งนี้ควรเปลี่ยนไฟล์เดียว


4
ขึ้นอยู่กับคำตอบอื่น ๆ ทั้งหมดที่มีคำสั่งยาว ขอบคุณ
masterxilo

ยินดี. ฉันไม่รู้ว่าเกิดอะไรขึ้นกับคำตอบอื่น ๆ .. lol
thestar

13
นี่กลับเป็นการแก้ไขแบบไหน? Doc กล่าวว่าแทนที่ด้วย repo ล่าสุด คำถามคือวิธีเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า
tgkprog

1
สิ่งนี้จะเปลี่ยนเป็น repo เวอร์ชันล่าสุด หากคุณอ่านคำอธิบายของคำถามดูเหมือนว่าเขากำลังมองหาวิธีแปลงไฟล์เดียวไม่ใช่ไดเรกทอรีทั้งหมด
2557

5
ฉันเชื่อว่าสิ่งนี้จะทำลายสำเนาการทำงานของคุณโดย 'คืนค่า' มันกลับหัว หรือสิ่งที่เคยเช็คเอาท์ ยืนยันโดยทำการอัพเดตไฟล์ svn -r VER จากนั้นทำการเปลี่ยนกลับ svn
เจอราร์ด

50

สำหรับไฟล์เดียวคุณสามารถทำได้:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

คุณสามารถทำได้svn revert <file>แต่จะคืนค่าสำเนาการทำงานล่าสุดเท่านั้น


2
ส่งออกแล้ววางลงในสำเนาในเครื่องของคุณแล้วส่งอีกครั้ง?
tgkprog

1
@tgkprog ว่าเป็นวิธีหนึ่งที่จะทำมันใช่
มิทช์ก้าว

@tgkprog และวิธี "ที่ต้องการ" คืออะไร?
hbogert

ไม่มีความคิด แต่นั่นคือสิ่งที่ได้ผลสำหรับฉัน: ส่งออกการแก้ไขที่ผ่านมา เปิดใน notepad, คัดลอก, วางในไฟล์ทำงาน มุ่งมั่นที่จะมุ่งหน้าไปพร้อมกับความคิดเห็นเกี่ยวกับการปรับปรุงและสาเหตุ เครื่องมือ UI อาจมีวิธีที่ดีกว่า
tgkprog

21

จนถึงทุกคำตอบที่นี่ดูเหมือนจะมีข้อเสียที่สำคัญมีความซับซ้อน (จำเป็นต้องค้นหา repo URI) หรือพวกเขาไม่ทำสิ่งที่คำถามอาจถาม: วิธีการ Repo อยู่ในสถานะการทำงานอีกครั้งกับรุ่นเก่าของที่ ไฟล์

svn merge -r head:[revision-number-to-revert-to] [file-path]IMO เป็นวิธีที่สะอาดและง่ายที่สุดในการทำเช่นนี้ โปรดทราบว่าการนำไฟล์ที่ถูกลบกลับมาดูเหมือนจะไม่ทำงานเช่นนี้ [1] ดูคำถามต่อไปนี้: วิธีที่ดีกว่าในการแปลงกลับเป็น SVN ก่อนหน้าแก้ไขไฟล์หรือไม่

[1] สำหรับสิ่งที่คุณต้องการsvn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn upดูวิธีที่ถูกต้องในการกู้คืนไฟล์ที่ถูกลบจาก SVN คืออะไร?


ฉันต้องการที่จะตั้งข้อสังเกตว่าอย่างน้อยสำหรับ Subversion เวอร์ชันของฉันsvn mergeไม่ได้ใช้หลายไฟล์เป็นอาร์กิวเมนต์ด้วยเหตุผลบางอย่าง ในกรณีนี้ดูเหมือนว่าจะไม่ทำอะไรเลย (ไม่มีข้อความแสดงข้อผิดพลาด)
Wrzlprmft

แต่คำสั่งของฉันยังคงใช้งานได้โดยทำซ้ำสำหรับแต่ละไฟล์ใช่ไหม
Michel Müller

ใช่มันทำอย่างแน่นอน
Wrzlprmft

1
ตกลงกันว่านี่คือสิ่งที่สะอาดที่สุด
KevinG

13

วิธีที่ดีที่สุดคือ:

svn merge -c -RevisionToUndo ^/trunk

การดำเนินการนี้จะยกเลิกไฟล์ทั้งหมดของการแก้ไขมากกว่าเพียงแค่แปลงไฟล์ที่คุณไม่ต้องการเลิกทำ อย่าลืมเครื่องหมายขีดคั่น ( -) เป็นคำนำหน้าสำหรับการแก้ไข

svn revert File1 File2

ตอนนี้ยอมรับการเปลี่ยนแปลงกลับ


9

คุณต้องการจะทำ

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

เมื่อคุณทำเช่นนั้นคุณจะได้รับการแก้ไขไฟล์ในสถานะที่กำหนดได้ ยอมรับไฟล์


7

ฉันพบว่ามันง่ายที่จะทำผ่านsvn catคำสั่งเพื่อให้คุณไม่ต้องระบุการแก้ไข

svn cat mydir/myfile > mydir/myfile

สิ่งนี้อาจจะไม่ทำหน้าที่คืนข้อมูล inode (ข้อมูลเมตา) เช่นการประทับเวลา


จากนั้นส่งไฟล์ไปที่ repo
tgkprog

3
สิ่งนี้ใช้งานได้ดีกว่าการอัปเดต เนื่องจากการอัพเดตไม่อนุญาตให้คุณส่งการดัดแปลงที่ทำกับไฟล์นั้น (svn 1.8.3)
fe_lix_

7

ประหลาดใจไม่มีใครพูดถึงเรื่องนี้

โดยไม่ต้องค้นหาหมายเลขการแก้ไขที่คุณสามารถเขียนได้หากคุณเพิ่งยืนยันสิ่งที่คุณต้องการเปลี่ยนกลับใช้งานได้ถ้าคุณเปลี่ยนไฟล์อื่นและไฟล์เป้าหมายไม่ใช่ไฟล์ที่ถูกเปลี่ยนครั้งล่าสุด

svn merge -r HEAD:PREV file

หากคุณมีความคิดเห็นโปรดพูดคุยที่นี่ก่อนทำการแก้ไข?
Kalpesh Soni

1
สถานการณ์ในคำถามไม่ต้องการการย้อนกลับของการเปลี่ยนแปลงล่าสุดเช่นเราควรใช้การเปลี่ยนแปลงที่จำเป็นในการเปลี่ยนจาก HEAD เป็น PREV หรือไม่
นิครุสโซ

4
คำสั่งควรเป็นsvn merge -r HEAD:PREV fileอย่างที่ @Nick Russo พูดว่า
Heinz

4

หากเป็นไฟล์เพียงไม่กี่ไฟล์และหากคุณใช้ Tortoise SVN คุณสามารถใช้วิธีการต่อไปนี้:

  1. คลิกขวาที่ไฟล์ต้นฉบับแล้วเลือก "TortoiseSVN" -> "Show log"
  2. คลิกขวาที่การแก้ไขในบันทึกและเลือก "บันทึกการแก้ไขเป็น ... "
  3. ให้รุ่นเก่าเขียนทับไฟล์ปัจจุบันของคุณ
  4. ยอมรับไฟล์ต้นฉบับที่ถูกเขียนทับ

สิ่งนี้จะบันทึกไฟล์ที่ไม่มีเวอร์ชันใหม่เช่น file-xxxx โดยที่ xxxx คือหมายเลขการแก้ไขเก่า เราทำอะไรต่อไป ลบการแก้ไขใหม่ (HEAD เช่น), เปลี่ยนชื่อไฟล์ใหม่เพิ่มกระทำ?
Heinz

ไม่ไม่ต้องบันทึกด้วยหมายเลขการแก้ไขในชื่อไฟล์ บันทึกด้วยชื่อไฟล์เดียวกันกับเวอร์ชันปัจจุบันของไฟล์เดียวกัน (ในคำอื่น ๆ ไม่มี xxxx ในชื่อไฟล์) จากนั้นก็ทำคอมมอนธรรมดาหลังจากนั้น
Elling

4

เพียงเพิ่มคำตอบไปยัง @Mitch Dempsy เนื่องจากฉันยังไม่มีตัวแทนมากพอที่จะแสดงความคิดเห็น

svn export -r <REV> svn://host/path/to/file/on/repos --force

การเพิ่ม --force จะเขียนทับโลคัลสำเนาด้วยการส่งออกจากนั้นคุณสามารถทำ svn เพื่อส่งไปยังที่เก็บ


และนี่คือคำตอบที่ดีที่สุด :)
Zgr3doo

ทำไมนี่คือคำตอบที่ดีที่สุด มันไม่ได้จัดการประวัติ "svn way"
Jason S

2

ตัวเลือกอื่นสำหรับไฟล์เดียวคือ "แทนที่" เวอร์ชันปัจจุบันของไฟล์ด้วยการแก้ไขที่เก่ากว่า:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

นี่คือคุณสมบัติที่เพิ่มเข้ามาซึ่งการเปลี่ยนแปลงที่ไม่พึงประสงค์จะไม่ปรากฏในบันทึกสำหรับไฟล์นี้ (เช่น svn log file.ext)


1

หากคุณต้องการย้อนกลับแต่ละไฟล์จากการแก้ไขเฉพาะและสามารถกระทำได้ให้ทำดังนี้

svn merge -c - [OldRev #] [ชื่อไฟล์]

กล่าวคือ svn merge -c -150 myfile.py

จดบันทึกค่าลบของหมายเลขการแก้ไข


-1
sudo svn revert filename

นี่เป็นวิธีที่ดีกว่าในการย้อนกลับไฟล์เดียว


2
ฉันหวังว่าคุณจะไม่เคยเข้าใกล้เครื่องจักรที่มีสิทธิ์ sudoer
David Lakatos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.