ฉันจะคืนค่า SVN ที่ส่งคืนได้อย่างไร


303

ฉันได้พบตัวอย่างมากมายของวิธีการคืนค่า SVN ที่กระทำเช่นนั้น

svn merge -r [current_version]:[previous_version] [repository_url]

หรือ

svn merge -c -[R] .

แต่ดูเหมือนว่าพวกเขาทั้งสองจะไม่ทำงาน ฉันลองคำสั่งเหล่านั้นและตรวจสอบไฟล์ที่เปลี่ยนแปลงด้วยมือ

ฉันจะเปลี่ยนการยืนยันด้วยหมายเลขการแก้ไข 1944 ได้อย่างไร ฉันจะตรวจสอบได้อย่างไรว่าการแปลงกลับได้ดำเนินการแล้ว (โดยไม่ได้ดูไฟล์จริงของการเปลี่ยนแปลงที่ถูกเปลี่ยนกลับ)


16
คุณไม่เคยยอมรับคำตอบเพราะไม่มีใครทำงาน?
2rs2ts

4
หากคุณต้องการคำตอบที่แท้จริงให้ใช้ "svn merge -c -1944" วิธีตรวจสอบว่าใช้งานได้หรือไม่: "svn diff"
John Sampson

ดูเพิ่มเติมลบร่องรอยทั้งหมดของ SVN กระทำ
Vadzim


ถ้าเป็นเช่นนั้นฉันมี 1943 (การกระทำดี) จากนั้น 1944 (การกระทำไม่ดี) จากนั้น 1945 (การกระทำดี) จากนั้นปี 1946 (การกระทำดี) ตอนนี้ฉันต้องการลบเพียง 1,944 (กระทำไม่ดี) และให้การแก้ไขทั้งหมดหลังจาก 1944 หมายความว่าฉันต้องการผลลัพธ์เช่น 1943,1945,1946 (ลบเฉพาะ 1944) จากการแก้ไขเหล่านี้ทั้งหมดฉันควรทำอย่างไร ??
Bhavin_m

คำตอบ:


448

ทั้งสองตัวอย่างต้องใช้งานได้ แต่

svn merge -r UPREV:LOWREV . ยกเลิกช่วง

svn merge -c -REV . ยกเลิกการแก้ไขครั้งเดียว

ในรูปแบบนี้ - ถ้า dir ปัจจุบันคือ WC และ (ตามที่ต้องทำหลังจากการรวมทุกครั้ง) คุณจะยอมรับผลลัพธ์

คุณต้องการที่จะเห็นบันทึก?


9
@dwjohnston - ใช่การผสานจะดำเนินการใน WC เสมอและไม่ใช่งานฝั่งเซิร์ฟเวอร์
Lazy Badger

14
svn: Merge source required. ไม่มีลูกเต๋า
2rs2ts

27
@ 2rs2ts ดูเหมือนว่าคุณลืมจุดต่อท้ายเพื่อกำหนด 'ทำสิ่งนี้ในไดเรกทอรีปัจจุบัน'
Dalin

14
นอกจากนี้คุณยังสามารถทำคอมมิทหลายรายการพร้อมกันได้:svn merge -c -42587,-42589 .

1
@ahnbizcad - การแก้ไข (เดี่ยว) ซึ่งคุณต้องการยกเลิก
Lazy Badger

130

หากคุณกำลังใช้TortoiseSVNลูกค้าก็ทำได้อย่างง่ายดายผ่านทางโต้ตอบแสดงเข้าสู่ระบบ


5
นี่เป็นวิธีที่ง่ายที่สุดที่จะทำ
Markku K.

5
สิ่งนี้ล้าสมัยแล้ว ไม่มี Context-Menu สำหรับไคลเอ็นต์ในเวอร์ชันปัจจุบันอีกต่อไป
user1789573

19
อะไร? TortoiseSVN เป็นเมนูบริบทรวมถึงกล่องโต้ตอบที่วางไข่ คุณหมายถึงอะไรโดย "ไม่มีเมนูบริบท" อีกต่อไป? แน่นอนที่สุดคือ!
Ben

@Ben ฉันคิดว่า user8,89573 ได้รับการเพิ่มขึ้นเล็กน้อยในการกล่าวถึงอย่างชัดเจนของ "เมนูบริบท" ในการกวดวิชาที่เชื่อมโยงกับคำตอบ
Tom Catullo

2
ในกรณีที่คุณเห็นสิ่งนี้ในภายหลังมัน (ยัง) อยู่ที่นั่น ในหน้าจอล็อกการแสดงให้คลิกขวาที่การแก้ไขและมีตัวเลือก "เปลี่ยนกลับเป็นการแก้ไขนี้" นี่คือ TortoiseSVN 1.9.4 Build 27285 ฉันเพิ่งใช้ไปและสามารถบอกคุณได้ว่าใช้งานได้ดี
Bruce Van Horn

65

svn merge -r 1944:1943 .ควรย้อนกลับการเปลี่ยนแปลงของ r1944 ในสำเนาการทำงานของคุณ จากนั้นคุณสามารถตรวจสอบการเปลี่ยนแปลงในสำเนาการทำงานของคุณ (ที่มี diff) แต่คุณต้องยอมรับเพื่อที่จะนำการเปลี่ยนกลับมาใช้ในพื้นที่เก็บข้อมูล


4
ไม่ทำงานต้องการแหล่งที่มาผสาน พยายามsvn merge -r 1944:1943 .แทน แต่ไม่มีอะไรเปลี่ยนแปลง
อเล็กซ์

ที่เก็บมีความก้าวหน้าตั้งแต่ r1944 หรือไม่? ถ้าเป็นเช่นนั้นมีการเปลี่ยนแปลงที่ขัดแย้งกันในบรรทัดเดียวกันกับการเปลี่ยนแปลงระหว่าง r1943 และ r1944 หรือไม่?
onon15

ฉันอยู่ที่การแก้ไขในปี 1945 และดูเหมือนจะไม่มีความขัดแย้ง ทั้งsvn statusมิได้svn diffให้อะไร
อเล็กซ์

7
ข้อผิดพลาด:svn: Try 'svn help' for more info svn: Merge source required
Alex

5
แต่svn merge -r 1945:1943 .ดูเหมือนว่าจะได้ผล ฉันคิดว่าฉันเข้าใจ: คุณต้องรวมเวอร์ชันจาก 'ก่อน' คำว่า 'ไม่ดี' ลงในที่เก็บข้อมูลที่ใช้งานได้ของคุณ ไม่เป็นไรเมื่อคุณต้องการ 'ย้อนกลับ' การกระทำก่อนหน้านี้อย่างง่าย แต่ถ้าคุณต้องการยกเลิกการเปลี่ยนแปลงที่ทำกับรุ่น 1900
อเล็กซ์

45

ก่อนอื่นให้ย้อนกลับสำเนาการทำงานเป็น 1943

> svn merge -c -1943 .

ประการที่สองตรวจสอบสิ่งที่จะเกิดขึ้น

> svn status

ประการที่สามกระทำเวอร์ชัน 1945

> svn commit -m "Fix bad commit."

ประการที่สี่ดูบันทึกใหม่

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

1
ถ้าเป็นเช่นนั้นฉันมี 1943 (การกระทำดี) จากนั้น 1944 (การกระทำไม่ดี) จากนั้น 1945 (การกระทำดี) จากนั้นปี 1946 (การกระทำดี) ตอนนี้ฉันต้องการลบเพียง 1,944 (กระทำไม่ดี) และให้การแก้ไขทั้งหมดหลังจาก 1944 หมายความว่าฉันต้องการผลลัพธ์เช่น 1943,1945,1946 (ลบเฉพาะ 1944) จากการแก้ไขเหล่านี้ทั้งหมดฉันควรทำอย่างไร ??
Bhavin_m

26

เป็นไปไม่ได้ที่จะ "ยกเลิกการแก้ไข" แต่คุณสามารถเปลี่ยนสำเนาการทำงานของคุณเป็นเวอร์ชัน 1943 และยอมรับว่าเป็นเวอร์ชัน 1945 เวอร์ชัน 1943 และ 1945 จะเหมือนกันโดยการคืนค่าการเปลี่ยนแปลงได้อย่างมีประสิทธิภาพ


18
เพียงเพื่อให้ถูกต้องน่ารำคาญฉันจะแสดงความคิดเห็นว่าถ้าคุณมีผู้ดูแลระบบสามารถเข้าถึงที่เก็บคุณสามารถ "uncommit" โดยการสร้างที่เก็บโคลนถึงการแก้ไขให้ใช้แล้วsvn dump svn loadแต่แน่นอนว่าสิ่งนี้ไม่ควรใช้ในสถานการณ์ปกติ
onon15

4
ฉันไม่ต้องการเลิกผูกมัดฉันต้องการสร้างหมายเลขการส่งมอบใหม่ด้วยการส่งข้อมูลบางรายการ ชุดบอกว่าฉันได้ตรวจสอบรุ่น 1944 ทำกระทำในปี 1945 ซึ่งฉันต้องการที่จะ 'เปลี่ยนกลับ' ถ้าอย่างนั้นฉันอยากได้รุ่น 1946 ซึ่งมีไฟล์เหมือนกันในรุ่น 1944 (ยกเว้นประวัติแน่นอน) แต่คำถามก็ยังคงอยู่: ทำอย่างไร? คำสั่งคืออะไร?
อเล็กซ์

// @ Alex $ git revertผมสนใจในเรื่องนี้มากเกินไปโดยเฉพาะอย่างยิ่งในบางสิ่งบางอย่างที่คล้ายคลึงกับ ฉันพบว่ามันยากที่จะเรียนรู้ SVN หลังจากใช้ Git มานาน
Nathan Basanese

10

ต่อไปนี้จะทำงานในลักษณะแห้ง HEAD เป็นเวอร์ชันปัจจุบัน PREV เป็นรุ่นก่อนหน้าจากนั้นพา ธ ไปยังไฟล์ของคุณหรือรายการที่กำหนด:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

หากการรันแบบแห้งดูดีให้รันคำสั่งโดยไม่ใช้ --dry-run

ตรวจสอบการเปลี่ยนแปลงในการแก้ไขและกระทำอีกครั้ง ในการเรียกดูหมายเลขรุ่นลอง:

svn log

4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

สิ่งนี้ต้องใช้สำเนาภายในเครื่องหรือไม่เพื่อให้แตกต่างจากการแก้ไขที่ผิด
Eliezer Miron


2

แม้ว่าคำแนะนำที่ให้ไว้อาจใช้ได้กับบางคน แต่ก็ไม่ได้ผลสำหรับกรณีของฉัน เมื่อดำเนินการผสานผู้ใช้rev 1443ที่อัปเดตrev 1445ยังคงซิงค์ไฟล์ทั้งหมดที่เปลี่ยนแปลงใน1444แม้ว่าจะเท่ากับ1443จากการผสาน ฉันต้องการให้ผู้ใช้ปลายทางไม่เห็นการอัพเดทเลย

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

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

สิ่งนี้ใช้ได้กับฉันบางทีมันอาจจะเป็นประโยชน์กับคนอื่นที่นั่น =)


2
svn merge -c -M PATH

สิ่งนี้ช่วยชีวิตฉันได้

ฉันมีปัญหาเดียวกันหลังจากย้อนกลับและฉันไม่เห็นรหัสเก่า หลังจากใช้คำสั่งข้างต้นฉันได้รับรหัสเวอร์ชั่นเก่าที่สะอาด


1

ฉันลองด้านบน ( svn merge) และคุณพูดถูกแจ็ค อย่างไรก็ตาม

svn update -r <revision> <target> [-R]

ดูเหมือนว่าจะทำงาน แต่ไม่ถาวร (svn ของฉันเป็นเพียงการแสดงการแก้ไขเก่า) ดังนั้นฉันต้อง

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

interfaces/AngelInterface.phpโดยเฉพาะในกรณีของฉันเป้าหมายของฉันคือ ฉันทำการเปลี่ยนแปลงไฟล์ส่งคอมมิชชันอัพเดตคอมพิวเตอร์การสร้างรันคอมไพเลอร์ phpdoc และพบว่าการเปลี่ยนแปลงของฉันเสียเวลา svn log interfaces/AngelInterface.phpแสดงการเปลี่ยนแปลงของฉันในฐานะ r22060 และการคอมมิชชันก่อนหน้านี้ในไฟล์นั้นคือ r22059 ดังนั้นฉันจึงสามารถsvn update -r 22059 interfaces/AngelInterface.phpลงเอยด้วยรหัสได้เหมือนเดิมใน -r22059 อีกครั้ง จากนั้น: -

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

อีกทางเลือกหนึ่งที่ฉันจะทำในสิ่งเดียวกันในไดเรกทอรีโดยระบุ. -Rในสถานที่ของinterfaces/AngelInterface.phpในทั้งหมดข้างต้น


1
อีกอย่างหนึ่งที่ได้กล่าวไปแล้วสิ่งที่คุณไม่สามารถทำได้คือลบการกระทำจากประวัติศาสตร์เช่นคุณสามารถทำได้โดยการแฮ็คผู้อ้างอิงโดยตรง สิ่งที่คุณทำได้คือใช้พื้นที่เก็บข้อมูลเพื่อเปลี่ยนแหล่งที่มาของคุณเป็นวิธีที่คุณตั้งใจและยอมรับว่าเป็นการเปลี่ยนแปลง
sibaz

หลังจากตรวจสอบเพิ่มเติมฉันจะเห็นว่าเป็นไปได้ที่จะลบการกระทำออกจากประวัติศาสตร์โดยใช้ svnadmin แต่คุณได้รับคำแนะนำอย่างมาก ดูstackoverflow.com/questions/5566327/…
sibaz

0

หากคุณต้องการลบการคอมมิทออกจากประวัติคุณสามารถทำการดัมพ์ของ repo ที่การแก้ไขเฉพาะจากนั้นนำเข้าการถ่ายโอนข้อมูลนั้น โดยเฉพาะ:

svnrdump dump -r 1:<rev> <url> > filename.dump

คำสั่ง svnrdump ดำเนินการฟังก์ชันเดียวกันกับการถ่ายโอนข้อมูล svnadmin แต่ทำงานบน repo ระยะไกล

ถัดไปเพียงนำเข้าไฟล์ดัมพ์ไปยัง repo ที่คุณต้องการ สิ่งนี้ได้รับการทดสอบว่าทำงานได้ดีบน Beanstalk

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