มีคำสั่ง Subversion เพื่อรีเซ็ตสำเนาที่ใช้งานได้หรือไม่?


110

มีคำสั่ง Subversion คำสั่งเดียวที่จะ "รีเซ็ต" สำเนาที่ใช้งานได้ตรงกับสถานะที่เก็บไว้ในที่เก็บหรือไม่ สิ่งที่ต้องการgit reset --hardหรือ (ฮ่าฮาร์ดรีเซ็ต Git ไม่ลบไฟล์ unversioned rm -rf wc && svn co <url> wcทั้ง!)

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


การคืนค่าการเปลี่ยนแปลงทั้งหมดในสำเนาการทำงาน?
mauris

5
คุณจะใช้git clean -xdfเพื่อลบสิ่งที่ไม่อยู่ภายใต้การควบคุมแหล่งที่มา
vcsjones

1
@vcsjones: ขอบคุณหน้าคนสำหรับgit cleanคำพูดที่ตรงกับสิ่งที่ฉันกำลังมองหา: "สิ่งนี้สามารถใช้ (อาจใช้ร่วมกับการรีเซ็ตคอมไพล์) เพื่อสร้างไดเร็กทอรีการทำงานที่เก่าแก่เพื่อทดสอบการสร้างใหม่ทั้งหมด" สงสารที่ Subversion ดูเหมือนจะไม่ได้บิวท์อินอะไรแบบนี้
zoul

คำตอบ:


180

คุณสามารถเปลี่ยนกลับซ้ำได้ดังนี้:

svn revert --recursive .

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

แก้ไข : วิธีแก้ปัญหาสำหรับสคริปต์โฆษณาอยู่ที่นี่: ลบไฟล์ที่ไม่ได้เวอร์ชัน Subversion โดยอัตโนมัติ

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


3
คุณอาจต้องการรันsvn cleanupบน wc ก่อนเช่นกัน นี่เป็นแนวปฏิบัติมาตรฐานของฉันในการทำความสะอาดหลังจากยกเลิกการผสานและอะไรก็ตาม
Mike Miller

เต่ายังมีตัวเลือก "ลบไฟล์ที่ไม่ได้เวอร์ชัน" ในกล่องโต้ตอบการล้างข้อมูล
v.oddou

2
คงจะดีไม่น้อยหากสามารถ "ลบไฟล์ที่ไม่ได้เวอร์ชัน" ผ่านทางบรรทัดคำสั่ง โดยเฉพาะอย่างยิ่งสำหรับการสร้างอัตโนมัติ
C. Tewalt

3
ดูคำตอบของฉัน ... - มีการลบการยกเลิกสำหรับการล้าง svn
Denny Weinberg

38

เพื่อเปลี่ยนกลับไฟล์ที่ติดตาม

svn revert . -R

เพื่อล้างไฟล์ที่ไม่ถูกติดตาม

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rfอาจ / ควรจะดูน่ากลัวในตอนแรก แต่เมื่อเข้าใจมันจะไม่เป็นด้วยเหตุผลเหล่านี้:

  1. เฉพาะไดเรกทอรีที่ไม่ได้ติดตามทั้งหมดเท่านั้นที่จะตรงกับรูปแบบที่ส่งไป rm
  2. -rfที่จำเป็นอื่นไดเรกทอรีเหล่านี้จะไม่ถูกลบ

เพื่อเปลี่ยนกลับแล้วทำความสะอาด (คำถาม OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

เพื่อความสะดวกในการใช้งานที่สม่ำเสมอ

เพิ่มนามแฝงถาวรใน. bash_aliases ของคุณ

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

ตัวอย่างที่ 2 ดูเหมือนจะใช้ไม่ได้สำหรับฉัน:awk: fatal: error reading input file '-': Input/output error
hbogert

ฉันต้องหลบหนี?ในawkคำสั่งมิฉะนั้นจะตรงกับทุกบรรทัดในผลลัพธ์ของsvn status
gpanders

23

ลบทุกอย่างในสำเนาในเครื่องของคุณโดยใช้:

rm -r your_local_svn_dir_path/*

และย้อนกลับทุกอย่างซ้ำ ๆ โดยใช้คำสั่งด้านล่าง

svn revert -R your_local_svn_dir_path

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


4
เร็วกว่ามากคือการล้างข้อมูล svn - ลบ - ยกเลิกการแปลง
Znik

7
svn revert . -R

เพื่อรีเซ็ตทุกอย่าง

svn revert path/to/file

สำหรับไฟล์เดียว


1
นั่นไม่ได้ลบไฟล์ที่ไม่ได้เวอร์ชันพิเศษในสำเนาที่ใช้งานได้ใช่หรือไม่?
zoul

@zoul ผมไม่คิดอย่างนั้น แต่ไม่พูดฉันว่าตั้งแต่มันถูกเดี๋ยวตั้งแต่ผมใช้ SVN
อาเบะ Voelker

น่าเสียดายที่มันไม่ได้สัมผัสไฟล์ที่ไม่ได้ติดตาม ลอง svn ย้อนกลับ -R your_local_svn_dir_path
Znik

7

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

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

ออก:

D         D:\tmp\sql\update\abc.txt

1
นี่คือคำตอบที่ดีที่สุดโดยไม่ต้องเขียนสคริปต์เพิ่มเติม นี่เป็นสากลและเข้ากันได้กับเวอร์ชัน svn มากมาย
Znik

3

โซลูชัน cmd / bat ของ Windows บริสุทธิ์:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

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


ช้าอย่างเจ็บปวด นั่นเป็นเหตุผลที่ฉันกำลังมองหาวิธีแก้ปัญหานี้
zoul

1
+1 นี่เป็นวิธีเดียวที่จะแก้ไขปัญหาแปลก ๆ อย่างน้อยก็ที่ฉันพบ
Brad

2

ง่ายและรวดเร็วมากและทำในสิ่งที่คุณต้องการ

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/ มีไว้เพื่อวัตถุประสงค์ของฉันเอง

และอาจเป็นความคิดที่ดีที่จะเพิ่ม --no-ignored ในคำสั่ง svn


2
นี่มันแย่มาก แล้วผู้ใช้ Windows ล่ะ? เห็นได้ชัดว่าการโค่นล้มต้องทำงานเล็กน้อยก่อนที่จะนำมาใช้อย่างจริงจังในฐานะเครื่องมือควบคุมเวอร์ชัน
Warren P

1

เพื่อลบไฟล์ที่ไม่ได้ติดตาม

ฉันสามารถแสดงรายการไฟล์ที่ไม่ได้ติดตามทั้งหมดที่รายงานโดยsvn stbash โดยทำ:

echo $(svn st | grep -P "^\?" | cut -c 9-)

หากคุณรู้สึกโชคดีคุณสามารถแทนที่echoด้วยrmการลบไฟล์ที่ไม่ถูกติดตาม หรือคัดลอกไฟล์ที่คุณต้องการลบด้วยมือหากคุณรู้สึกไม่ค่อยโชคดี


(ฉันใช้คำตอบของ @ abe-voelker เพื่อเปลี่ยนกลับไฟล์ที่เหลือ: https://stackoverflow.com/a/6204601/1695680 )

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