ฉันจะลบการเปลี่ยนแปลงทั้งหมดในไดเรกทอรีทำงาน SVN ได้อย่างไร


195

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

คำตอบ:


274
svn revert -R .
svn up

สิ่งนี้จะแปลงไดเรกทอรีปัจจุบันซ้ำและทุกสิ่งที่อยู่ภายใต้ไดเรกทอรีนั้นซ้ำแล้วอัปเดตเป็นเวอร์ชันล่าสุด


2
โปรดทราบว่าสิ่งนี้ใช้ไม่ได้กับผู้ที่อยู่ภายนอก
cic

86

ฉันใช้การผสมผสานของคำตอบของคนอื่น ๆ เพื่อหาทางแก้ปัญหานี้:

ย้อนกลับการเปลี่ยนแปลง SVN ท้องถิ่นปกติ

svn revert -R .

ลบการเปลี่ยนแปลงอื่น ๆ และรองรับการลบไฟล์ / โฟลเดอร์ด้วยช่องว่าง ฯลฯ

svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf

อย่าลืมรับไฟล์ล่าสุดจาก SVN

svn update --force

ขอบคุณ Shaize มากนี่เป็นรถที่สง่าที่สุด ... ท่อที่ฉันเคยเห็นมาแล้ว :) โดยเฉพาะอย่างยิ่งการใส่ใจในเรื่องนี้ด้วย
คนพาล

ทำงานเหมือนจับใจ ขอบคุณ!
Niilo Keinänen

28
svn revert -R .
svn cleanup . --remove-unversioned

มันไม่ได้ลบไฟล์ * .class เป็นต้น
Trismegistos

2
ถ้าคุณต้องการที่จะลบไฟล์ที่ไม่สนใจsvn cleanup . --remove-ignored
Kip

14

หากคุณไม่มีการเปลี่ยนแปลงคุณสามารถทำตัวขี้เกียจและทำอะไร ...

rm -rf *
svn update

แต่ไม่มีจริงๆไม่ได้ทำอย่างนั้นจนกว่าคุณจะแน่ใจจริงๆว่าตัวเลือกอาวุธนิวเคลียร์จากพื้นที่คือสิ่งที่คุณต้องการ !! สิ่งนี้มีข้อดีของการรวมกันของการสร้าง cruft ไฟล์ชั่วคราวและสิ่งต่าง ๆ ที่ SVN ข้าม

ทางออกที่ถูกต้องมากขึ้นคือการใช้คำสั่งเปลี่ยนกลับ:

svn revert -R .

-R ทำให้เกิดการโค่นล้มในการเรียกคืนและยกเลิกทุกสิ่งในและต่ำกว่าไดเรกทอรีการทำงานปัจจุบัน


ฉันมักจะใช้เคล็ดลับนี้ แต่ด้วย SVN 1.7 ที่เมตาดาต้าถูกเก็บไว้ในรูต WC เท่านั้นนี่ไม่ได้เป็นวิธีแก้ปัญหาที่สะอาดอีกต่อไป ตัวอย่างเช่นไฟล์ที่ถูกลบจะยังคงถูกลบ
Bart van Heukelom

8
svn nuke-from-space
Jason Swett

9

ไม่มีคำตอบที่นี่เป็นสิ่งที่ฉันต้องการ นี่คือสิ่งที่ฉันมาด้วย:

# Recursively revert any locally-changed files
svn revert -R .

# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
    perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
    tr '\n' '\0' | xargs -0 rm -rf

ทดสอบบน Linux; อาจทำงานใน Cygwin แต่ขึ้นอยู่กับ (ฉันเชื่อว่า) ส่วนขยายเฉพาะของ GNU ซึ่งอนุญาตให้ xargs แยกออกจากกัน'\0'แทนที่จะเป็นช่องว่าง

ข้อดีของคำสั่งดังกล่าวคือไม่จำเป็นต้องมีกิจกรรมเครือข่ายใด ๆ ในการรีเซ็ตแซนด์บ็อกซ์ คุณได้สิ่งที่คุณเคยมีมาก่อนและสูญเสียการเปลี่ยนแปลงทั้งหมด (ปฏิเสธความรับผิดชอบก่อนที่จะมีคนโทษฉันสำหรับรหัสนี้ทำลายงานของพวกเขา) ;-)

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

แก้ไข : ฉันไม่แน่ใจว่าจะทำงานกับการโค่นล้มทุกรุ่น ไม่ชัดเจนหากsvn statusคำสั่งถูกจัดรูปแบบเสมอ ใช้ความเสี่ยงของคุณเองเช่นเดียวกับคำสั่งใด ๆ ที่ใช้rmคำสั่งแบบครอบคลุม


7

การเปลี่ยนกลับจะยกเลิกการเปลี่ยนแปลงในท้องถิ่นที่คุณทำไว้


5

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อยกเลิกการเปลี่ยนแปลงในเครื่องทั้งหมด:

svn st -q | awk '{print $2;}' | xargs svn revert

ฉันได้รับข้อความแสดงข้อผิดพลาด "มีข้อโต้แย้งไม่เพียงพอ" สำหรับการเปลี่ยนกลับ svn
เวียน

4
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

จะลบไฟล์ใด ๆ ที่ได้รับการแก้ไข ฉันดูเหมือนจะจำได้ว่ามีปัญหากับการย้อนกลับเมื่ออาจมีการเพิ่มไฟล์และไดเรกทอรี



0

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

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)

หากคุณต้องการลบการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดและวัตถุที่ไม่มีการพลิกผันทั้งหมดจะต้องใช้ 2 ลูป:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
  svn rm --force "%%e"
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.