ฉันจะลบไฟล์ / โฟลเดอร์ทั้งหมดที่ไม่ได้ถูกเพิกเฉย / ถูกละเว้นในสำเนาการทำงานของฉันได้อย่างไร?


136

หากฉันมีสำเนาการทำงานของที่เก็บ Subversion มีวิธีการลบไฟล์ที่ไม่มีการยกเลิกหรือเพิกเฉยทั้งหมดในสำเนาการทำงานนั้นด้วยคำสั่งหรือเครื่องมือเดียวหรือไม่ โดยพื้นฐานแล้วฉันกำลังมองหาอะนาล็อก SVN git cleanไป

บรรทัดคำสั่งหรือโซลูชัน GUI (สำหรับ TortoiseSVN) อาจเป็นที่ยอมรับได้


คำตอบ:


98

ใช้ TortoiseSVN:


7
คุณสมบัติที่ดี! แต่ฉันต้องอ่านลิงค์เพื่อหาว่ามันใช้งานได้ในมุมมองรายการ (ไม่ใช่มุมมองแบบต้นไม้) บน XP - บางทีคุณควรรวมไว้ในคำตอบของคุณ
Nick Meyer

5
รุ่นบรรทัดคำสั่งของ svn (โดยเฉพาะบน windows) ไม่ได้มีฟังก์ชั่นเดียวกันหรือไม่?
blong

3
อย่างที่ใครสักคนชี้ให้เห็นด้านล่าง:svn cleanup --remove-unversioned --remove-ignored .
haui

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

คุณสมบัตินี้มีดังต่อไปนี้:

  • ไฟล์ที่ถูกละเว้นและไม่ได้ติดตามจะถูกลบ
  • มันใช้งานได้แม้ว่าชื่อไฟล์จะมีช่องว่าง (ยกเว้น newline แต่มีไม่มากที่สามารถทำได้เกี่ยวกับเรื่องอื่นนอกจากใช้--xmlตัวเลือกและแยกผลลัพธ์ xml ที่ได้)
  • มันทำงานได้แม้ว่าsvn statusพิมพ์ตัวอักษรสถานะอื่น ๆ ก่อนที่ชื่อไฟล์ (ซึ่งมันไม่ควรเพราะไฟล์ไม่ได้ติดตาม แต่ในกรณีที่ ... )
  • ควรทำงานกับระบบที่สอดคล้องกับ POSIX

ฉันใช้เชลล์สคริปต์ชื่อsvncleanที่มีต่อไปนี้:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

2
สิ่งที่ฉันกำลังมองหาทำงานเหมือนจับใจใน linux และ MacOS!
รวย

คุณต้องการรีเซ็ต IFS หรือไม่ ฉันเลือกที่จะไม่สร้างสคริปต์ 'svnclean' ดังนั้นฉันสงสัยว่าจะทำให้ IFS หมดไปในช่วงเวลาที่เหลือของสคริปต์หรือไม่
C Tewalt

3
@ matrixugly: ไม่คุณไม่จำเป็นต้องเปลี่ยนIFSกลับไปเป็นเหมือนเดิม เมื่อคุณทำเช่นVARNAME=value commandนั้นการมอบหมายของvalueถึงจะVARNAMEใช้เฉพาะในระหว่างการดำเนินการของcommand(มีข้อยกเว้นบางอย่างที่ไม่ได้นำไปใช้read) ดูข้อมูลจำเพาะ POSIXและรายงานข้อผิดพลาด POSIX นี้สำหรับรายละเอียดเพิ่มเติม
Richard Hansen

@ rich ขอบคุณสำหรับการแบ่งปัน มาหาวิธีแก้ปัญหาการล้างข้อมูล svn เมื่อไม่กี่ปีก่อนและเดินไปพร้อมกับความรู้ในการเขียนสคริปต์เชลล์! เห็นได้ชัดว่าฉันได้กลับมาที่คำตอบนี้สักหน่อย
C. Tewalt

120

ฉันรู้ว่านี้คือเก่า แต่ในกรณีที่คนอื่นสะดุดกับมันรุ่นใหม่ (1.9 หรือใหม่กว่า) การสนับสนุน SVN เช่น--remove-unversionedsvn cleanup . --remove-unversioned

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
สำหรับฉันนี่คือคำตอบที่ถูกต้อง มันเป็นคำตอบของบรรทัดคำสั่งข้ามแพลตฟอร์ม นอกจากนี้คุณสามารถลบไฟล์ที่ถูกละเว้นด้วยsvn cleanup . --remove-ignored
Dan Atkinson

1
ทำงานได้ใน svn 1.6 ขึ้นไป
wegry

2
โปรดเปลี่ยนสิ่งนั้นเป็น 1.9 โปรดดูsubversion.apache.org/docs/release-notes/1.9.html (ฉันลองภายในเครื่องและใช้งานไม่ได้และฉันใช้เวลา 1.8.8)
ikku100

2
ดูเหมือนว่าปัญหาที่เกิดขึ้นก็คือว่ามันไม่ได้ลบ unversioned โฟลเดอร์
Nyerguds

1
@Nyerguds: จริงแล้วนี่ไม่ได้เป็นการลบโฟลเดอร์ที่ไม่มีเวอร์ชัน แต่มีเพียงไฟล์ที่ไม่มีเวอร์ชันเท่านั้น มีใครพบวิธีแก้ปัญหา?
dhiraj suvarna

42

ผู้เผยแพร่รายนี้อาจช่วยคุณ:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

ใช้ด้วยความระมัดระวัง!


13
สิ่งนี้จะไม่ลบไฟล์ที่ถูกเพิกเฉยและจะแตกถ้าชื่อไฟล์มีช่องว่าง
Richard Hansen

1
และจะไม่ลบไฟล์ที่ถูกละเว้นด้วย
plaisthos

4
คุณสามารถใช้svn status --no-ignoreเพื่อจับไฟล์ที่ถูกละเว้นได้เป็นอย่างดี
Codure

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

15

แก้ไข Yanal-Yves Fargialla และคำตอบของ gimpf โดยใช้ Powershell (แต่ไม่ได้รับอนุญาตให้แสดงความคิดเห็นในโพสต์ต้นฉบับโดย Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

นี่เป็นการเพิ่มกะรัต ("^") เพื่อระบุจุดเริ่มต้นของบรรทัดหลีกเลี่ยงการจับคู่ไฟล์ทั้งหมดที่มีตัวอักษร "i" ยังเพิ่มแฟล็กสำหรับ -recurse และ -force to rm เพื่อทำให้คำสั่งนี้ไม่โต้ตอบและสามารถใช้งานได้ในสคริปต์


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

7

หลายสิ่งใน SVN สามารถทำได้หลายวิธีดังที่เห็นได้จากคำตอบของบรรทัดคำสั่งที่หลากหลาย ด้วยการถือกำเนิดของรุ่น 1.7 ยังมีอีกเทคนิคหนึ่งสำหรับ TortoiseSVN ที่จริงแล้วให้ความละเอียดของธัญพืชที่ดีกว่าคำตอบของ Stefan ที่ให้ไว้เพื่อให้คุณเลือกไฟล์ที่ไม่ใช่เวอร์ชันแยกต่างหากจากไฟล์ที่ถูกละเว้น เพียงเลือกTortoiseSvn >> Clean up...เพื่อเปิดกล่องโต้ตอบนี้

ตัวเลือกการล้าง TortoiseSVN


7

ด้วย PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

จากบรรทัดคำสั่ง:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"

3
ฉันรักสคริปต์ Windows ที่บริสุทธิ์นี้! ฉันขอแนะนำให้ใช้-match '[\?i]' -replace '^.{8}'แทนซึ่งจะทำงานได้อย่างถูกต้องแม้ว่าชื่อไฟล์จะเริ่มต้นด้วยช่องว่างและลบไฟล์ที่ถูกละเว้นด้วย
gimpf

1
การใช้ tweak ที่แนะนำของ gimpf ทำงานได้ดี แต่ฉันพบกรณีที่ฉันพบ ItemNotFoundException ปรากฎว่ามีไฟล์เพียงไฟล์เดียวในชุดผลลัพธ์สถานะ svn tweak นี้แก้ไขปัญหานั้น: code@ (สถานะ svn - ไม่สนใจ) - จับคู่ '[\? i]' -replace '^. {8}' | rm ` คิดออกด้วยความช่วยเหลือจากโพสต์นี้
dirtybird

1
และเนื่องจากจะแจ้งให้คุณทราบถึงไดเรกทอรีที่ไม่อยู่ใน svn (เนื่องจากไม่ได้ระบุการเรียกเก็บเงินคืน) จึงไม่ดีสำหรับการใช้งานในสคริปต์ ใช้:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Oneliner นี้ใช้งานได้สำหรับฉัน (ตามคำตอบของ Richard Hansen ซึ่งไม่น่าแปลกใจสำหรับไฟล์ที่มีช่องว่าง):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
เพื่อลบโฟลเดอร์ที่ไม่มีเวอร์ชันเช่นกันให้เพิ่ม-frในrmคำสั่ง: สถานะ svn --no-ละเว้น | grep '^ [I?]' | ตัด -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

ใช้ TortoiseSVN:

  1. คลิกขวาที่รูทของสำเนาการทำงานและเลือก TortoiseSVN -> "ตรวจสอบการดัดแปลง"
  2. เลือก "แสดงไฟล์ที่ถูกละเว้น"
  3. จัดเรียงตามคอลัมน์ "สถานะข้อความ"
  4. เลื่อนไปที่ไฟล์ "ที่ไม่ใช่เวอร์ชัน" ตอนนี้ทุกกลุ่มเข้าด้วยกัน; เลือกทั้งหมดและคลิกขวา -> ลบ
  5. เลื่อนไปที่ไฟล์ "ละเว้น" ตอนนี้ทุกกลุ่มเข้าด้วยกัน; เลือกทั้งหมดและคลิกขวา -> ลบ

ไม่ใช่วิธีที่ดีและสะอาดจริงๆ แต่เป็นวิธีที่เร็วที่สุดที่ฉันรู้ (ใน Windows)

ขอบคุณ pkh สำหรับคำแนะนำด้วยไฟล์ที่ถูกละเว้น


ฉันเชื่อว่านี่จะลบไฟล์ที่ไม่ใช่เวอร์ชันเท่านั้น รายการที่ถูกละเว้นจะไม่ได้รับผลกระทบ
Dirk Vollmar

2
คุณไม่จำเป็นต้องใช้กล่องโต้ตอบการส่งข้อมูลและคุณสามารถลบไฟล์ได้โดยคลิกขวาที่ | TortoiseSVN | ตรวจสอบการดัดแปลง จากนั้นคุณสามารถคลิก 'แสดงไฟล์ที่ถูกละเว้น' และเรียง / ลบอย่างเหมาะสม
pkh

4

นี้คล้ายกับคำตอบอื่น ๆ แต่จริง ๆ แล้วจะได้รับไฟล์ที่ถูกละเว้น (หมายเหตุ 'ฉัน' ใน REs):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
ตัวแบ่งนี้หากชื่อไฟล์มีช่องว่าง
Richard Hansen

4

บางคนบอกว่าคุณไม่สามารถทำได้จากบรรทัดคำสั่งของ Windows

วัว.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

ทำในบรรทัดเดียวและไม่ต้องการเครื่องมือ GNU เดียว :)


for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas

@DarienPardinas รุ่นของคุณมีประโยชน์อย่างยิ่งหากเสียบเข้ากับ Jenkins "Execute Windows batch command" ซึ่งฉันเพิ่งเรียนรู้ไม่ใช่พรอมต์คำสั่ง แต่เหมือนชุดสคริปต์ดังนั้นความต้องการ%%over%
jxramos

1

คุณไม่สามารถลบได้ด้วยเพียงแค่บรรทัดคำสั่ง SVN (ไม่แน่ใจเกี่ยวกับเครื่องมือ GUI) หากคุณอยู่ภายใต้ระบบ linux สิ่งนี้อาจช่วย:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

อีกวิธีหนึ่ง (โหดร้าย) คือการยอมรับการเปลี่ยนแปลงลบทั้งหมดจากโฟลเดอร์และชำระเงินอีกครั้ง

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