จะละทิ้งการเปลี่ยนแปลงในการชำระเงินแบบ SVN ได้อย่างไร


197

ฉันต้องการส่งความเห็นต่างๆ สำหรับโครงการโอเพ่นซอร์ส

ฉันได้รับรหัสโดยใช้ SVN (จาก terminal, Ubuntu) และฉันก็ทำการแก้ไขเล็กน้อยในไฟล์ไม่กี่ไฟล์ ขณะนี้มีการเปลี่ยนแปลงเพียงครั้งเดียวที่ฉันต้องการส่ง การเปลี่ยนแปลงที่เหลือที่ฉันทำมีไว้เพื่อการดีบั๊กและไม่ต้องการอีกต่อไป

ฉันได้สร้างความแตกต่างโดยใช้ svn di > ~/os/firstdiff.diff

ดังนั้นคำถามของฉันจะยกเลิกการเปลี่ยนแปลงในท้องถิ่นได้อย่างไร

มีวิธี SVN ที่จะทำหรือไม่ ถ้าไม่ฉันจะต้องไปที่แต่ละไฟล์และลบการแก้ไขทั้งหมดของฉัน จากนั้นฉันจะสร้าง diff ใหม่และส่ง

คำตอบ:


254

เพียงใช้svn revertคำสั่งตัวอย่างเช่น:

svn revert some_file.php

มันเป็น (เช่นเดียวกับคำสั่ง svn อื่น ๆ ) มีการบันทึกไว้อย่างดีในทรัพยากร svnbookหรือหน้าคนหรือแม้กระทั่งกับsvn helpคำสั่ง


2
ยกเว้นว่า Vinayak อาจต้องการที่จะทำให้การเปลี่ยนแปลงในท้องถิ่นของเขาไม่น่าสนใจสำหรับตัวเอง
Basile Starynkevitch

2
@BasileStarynkevitch: ฉันได้อ่านคำถามอีกครั้งและดูเหมือนว่าการเปลี่ยนแปลงอื่น ๆ ไม่จำเป็น: "" "การเปลี่ยนแปลงที่เหลือที่ฉันทำมีไว้สำหรับการดีบักโดยทั่วไปและไม่จำเป็นอีกต่อไป" "" :)
Cédric Julien

1
ใช่ ... แต่เขาต้องการที่จะรักษาพวกเขาต่อไปสำหรับตัวเขาเอง ... (คำถามของเขาอาจจะเข้าใจได้ทั้งสองวิธี)
Basile Starynkevitch

193

คุณต้องย้อนการเปลี่ยนแปลงทั้งหมดโดยใช้คำสั่งsvn revert :

  • ย้อนกลับการเปลี่ยนแปลงไฟล์: svn revert foo.c
  • ย้อนกลับไดเรกทอรีทั้งหมดของไฟล์: svn revert --recursive .

1
การอ้างอิงถึง svn 1.1 นั้นเก่านิดหน่อยแม้ว่ามันจะเป็นลิงค์แรกที่ให้โดย google ;)
จูริเซียน Julien

เห็นได้ชัดว่าอักขระบางตัวในชื่อไฟล์ของคุณสามารถถูกละเว้นได้ เช่น icon@2x.png svn revert icon@2x.png svn พูดว่า 'ไอคอน' ถูกข้ามไป
topwik

1
นี่คือคำตอบที่ดีที่สุด มันควรจะตรวจสอบ
rickfoosusa

12
svn revert --recursive .ช่วยให้ผมมาก
พอลวาร์กัส

นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจาก--recursiveพารามิเตอร์จะแปลงการเปลี่ยนแปลงในท้องถิ่นและนี่คือคำถาม
arueckauer

15

หากต้องการละทิ้งการเปลี่ยนแปลงในระบบในไฟล์เดียว:

$ svn revert example_directory/example_file.txt

หากต้องการยกเลิกการเปลี่ยนแปลงในเครื่องในโฟลเดอร์ใดโฟลเดอร์หนึ่ง:

$ svn revert -R example_directory/

7

ง่ายsvn revertพอสำหรับโปสเตอร์ดั้งเดิม อย่างไรก็ตามความเรียบง่ายsvn revertจะไม่ทำในกรณีทั่วไปที่คุณ

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

@ ErichBSchulz ข้อเสนอแนะการใช้งานgit add -pมีความสมเหตุสมผลมากและโดยทั่วไปจะมีความเหมาะสมมากกว่าในกรณีดังกล่าว คำตอบก็แค่ขาดรายละเอียดบางอย่าง สมมติว่าไดเรกทอรีปัจจุบันของคุณเป็นไดเรกทอรีที่คุณต้องการสร้างแพทช์แชร์ได้คุณสามารถทำสิ่งนี้:

  1. ชำระเงินรุ่นที่เก่าแก่จากการโค่นล้มไปยังไดเรกทอรีอื่น (เลือกชื่อไดเรกทอรีที่ไม่มีอยู่ที่นี่โดยใช้ไดเรกทอรีย่อยTMP/)

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. ใช้การชำระเงิน svn ดั้งเดิมนั้นเป็นพื้นฐานเริ่มต้นที่เก็บ git โดยไม่สนใจไดเรกทอรี. svn ส่งทุกอย่างในหัว svn ไปยังที่เก็บ git ชั่วคราวของคุณ

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. คัดลอกข้อมูลเมตาที่เก็บข้อมูล git ที่จัดเตรียมใหม่ไปยังไดเรกทอรีการทำงานดั้งเดิมของคุณ เนื่องจากไม่จำเป็นต้องมีไดเรกทอรีการชำระเงินการล้มล้างที่ถูกต้องคุณสามารถกำจัดมันได้ ไดเรกทอรีการทำงานของคุณอยู่ในขณะนี้ทั้งที่เก็บ git และ subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. ตอนนี้คุณสามารถใช้งานได้อย่างมีประสิทธิภาพและสะดวกสบายgit add -pในการเลือกสิ่งที่คุณต้องการแบ่งปันและโต้ตอบให้กับที่เก็บ git ของคุณ หากคุณต้องการเพิ่มไฟล์ลงในการคอมมิทให้ทำgit add <file-to-add>ก่อนหน้านี้git commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. ใช้คอมมิชชันเตรียมแพทช์ที่คุณต้องการแชร์ เพื่อจุดประสงค์นี้คุณสามารถใช้git diff HEAD^..HEADหรือgit format-patch(หลังสามารถใช้เพื่อเตรียมอีเมลที่จะส่งโดยตรงที่มีโปรแกรมแก้ไขหรือโปรแกรมแก้ไขหลายชุด):

    $ git show -p HEAD > my-mighty-patch.patch
    

เพื่อกำจัดข้อมูล meta rm -rf .git/คอมไพล์เพียงแค่ทำ หากคุณวางแผนที่จะแฮ็คกับไดเรกทอรีทำงานเดิมคุณสามารถใช้gitเพื่อจัดการการเปลี่ยนแปลงในท้องถิ่นของคุณต่อไป git svnในกรณีนี้คุณอาจจะได้รับประโยชน์จากการลงทุนของการเรียนรู้วิธีการใช้งาน

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


3
ขอบคุณมากสำหรับนิรนาม -1 โดยไม่มีคำอธิบายใด ๆ ฉันใช้เวลาในการปรับปรุงคำตอบโดยให้ความกระจ่างเมื่อวิธีการนี้เหมาะสม
FooF

2
ขอบคุณมากสำหรับการขยาย +1 จากฉัน! ไม่ต้องกังวล ฝูงชนที่ยากลำบาก
ErichBSchulz

1
ขอบคุณที่ยกนิ้วให้ @ErichBSchulz! ช้าเรากำลังทำให้โลกนี้เป็นสถานที่ที่ดีกว่าในการมีชีวิตอยู่แม้จะมีปฏิปักษ์ !!! ;-)
FooF

4

คุณสามารถใช้

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

เมื่อเผยแพร่ความแตกต่างของคุณอย่าลืมบอกการแก้ไขที่คุณกำลังแพร่กระจาย

ตามที่คนอื่น ๆ ตอบคุณสามารถใช้svn revertอย่างระมัดระวัง ขึ้นอยู่กับว่าคุณต้องการที่จะเปลี่ยนแปลงท้องถิ่นของคุณเพื่อทำงานในอนาคตหรือไม่ ...


+1 นี่เป็นทางออกที่ดีที่สุดสำหรับปัญหา แต่ในกรณีนี้ฉันต้องการกำจัดการเปลี่ยนแปลงทั้งหมดของฉัน แน่นอนฉันไม่ต้องการrevertเปลี่ยนแปลงตลอดเวลา ดังนั้นฉันจะใช้วิธีของคุณในอนาคต
Vinayak Garg

3

ไปที่รูทของที่เก็บและเรียกใช้คำสั่งต่อไปนี้

svn revert --depth=infinity .

1
svn revert -R .อาจจะสั้นกว่า
jesjimher

1

คุณสามารถใช้คำสั่ง commit กับไฟล์ที่คุณต้องการวางและใช้คำสั่ง svn revert เพื่อยกเลิกการเปลี่ยนแปลงที่เหลือ

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