คำสั่ง SVN เพื่อลบไฟล์ที่หายไปในเครื่องทั้งหมด


136

ใน SVN มีคำสั่งที่ฉันสามารถใช้เพื่อลบไฟล์ที่หายไปทั้งหมดในไดเร็กทอรีหรือไม่

หรือล้มเหลววิธีการบางอย่างในการแสดงเฉพาะไฟล์ที่หายไป (หรือในกรณีทั่วไปมีสถานะ A, D,? ฯลฯ )


1
ฉันดูแล 1 โฟลเดอร์ที่ใช้งานได้และ 1 โฟลเดอร์ชำระเงิน และย้ายเฉพาะไฟล์จากโฟลเดอร์ที่ทำงานไปยังโฟลเดอร์เช็คเอาต์ หากต้องเพิ่ม / ลบโฟลเดอร์ฉันจะทำด้วยตนเองแล้วย้ายไฟล์ไปยังโฟลเดอร์นั้น (เช่นแพ็คเกจใหม่แพ็คเกจเก่า) ปัญหา svn ส่วนใหญ่เกิดขึ้นเมื่อคุณย้ายโฟลเดอร์ในสำเนาที่ใช้งานได้ แม้ว่าจะจัดการไฟล์จากสำเนาที่ใช้งานไปยังสำเนาเช็คเอาต์คุณควรย้ายไฟล์เท่านั้นไม่ใช่โฟลเดอร์
Siddharth

คำตอบ:


99

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

หากคุณใช้ Windows แต่ชอบบรรทัดคำสั่งและสนุกกับการเล่น PowerShell หนึ่งซับนี้จะทำเคล็ดลับ:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

นั่นคือกรองเอาต์พุตให้เหลือเฉพาะบรรทัดที่แสดงไฟล์ที่หายไป (แสดงด้วยเครื่องหมายอัศเจรีย์ที่จุดเริ่มต้นของบรรทัด) จับชื่อไฟล์ที่เกี่ยวข้องและดำเนินการsvn rmกับชื่อไฟล์นั้น

(บล็อกโพสต์ลบไฟล์ที่“ หายไป” ทั้งหมดออกจากสำเนาที่ใช้งาน SVNจะทำสิ่งที่คล้ายกันสำหรับ Unix / Linux)


มีวิธีใน eclipse โดยใช้ปลั๊กอิน subclipse หรือไม่? มันแย่มากที่จะอัปเดตจากนั้นค้นหาในโปรเจ็กต์แล้วลบอีกครั้ง
สแตน

FYI ถ้าจำเป็นต้องใช้รหัสผ่านการโค่นล้มนี่คือไวยากรณ์: svn status --username user_name_here --password password_here | เหรอ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Matches [1] - ชื่อผู้ใช้ user_name_here - รหัสผ่าน password_here}
Jeff

คุณควรกระทำหลังจากบรรทัดนี้ก่อนที่จะดำเนินการsvn upหรือไม่? เนื่องจากไฟล์ถูกกู้คืนจากเซิร์ฟเวอร์ svn
Pierre

การดำเนินการนี้จะลบไฟล์ออกจากที่เก็บด้วยหรือไม่
Sebastián Ulloa

180

หากคุณใช้ Mac ( Darwin ) หรือ Linux คุณสามารถไพพ์เอาต์พุตของคำสั่งต่อไปนี้svn rmสำหรับไฟล์ที่หายไปทั้งหมด คุณสามารถตั้งค่าไดเร็กทอรีการทำงานปัจจุบันเป็นไดเร็กทอรีหรือไดเร็กทอรีย่อยที่เหมาะสมก่อนที่จะรันไดเร็กทอรีเหล่านี้ - ขึ้นอยู่กับว่าคุณต้องการรันสำเนาการทำงานทั้งหมดของคุณหรือเฉพาะเซ็ตย่อย

  1. เรียกใช้สถานะ svn
  2. ค้นหาบรรทัดที่ขึ้นต้นด้วย "!" (หายไป)
  3. พิมพ์ "--force" (อาร์กิวเมนต์ svn) และคอลัมน์ที่สอง (ชื่อไฟล์) ของเอาต์พุตจาก # 2
  4. รันsvn rmโดยใช้ผลลัพธ์ของ # 3 เป็นอาร์กิวเมนต์

ดังนั้นคำสั่งเต็มคือ:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

อ้างอิง:


4
จะไม่ได้ผลหากมีช่องว่างในชื่อไฟล์ ฉันไม่รู้ว่าจะแก้ไขได้ดีพอ
bugloaf

2
ใช้awk '{print " --force "$2"@"}'ถ้าชื่อไฟล์ของคุณมี a @(ถ้าคุณเป็นนักพัฒนา iOS)
Guillaume Algis

1
และจัดการชื่อไฟล์ด้วยช่องว่างawk '{$1=""; print " --force \""substr($0,2)"@\"" }'ควรทำเคล็ดลับ (และเริ่มดูน่าเกลียด)
Guillaume Algis

12
คำสั่งเต็มที่ดูแลพื้นที่คือ "svn st | grep ^! | awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
SmallChess

3
ทำไมคุณไม่ใส่--forceเข้าไปในส่วน xargs?
jwg

55
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. กรองเฉพาะไฟล์ที่หายไป
  3. ตัดเครื่องหมายอัศเจรีย์
  4. กรองช่องว่างต่อท้าย
  5. เพิ่มใบเสนอราคาชั้นนำ
  6. เพิ่มใบเสนอราคาต่อท้าย
  7. svn remove แต่ละไฟล์

วิธีนี้ใช้ได้ผลหากมีช่องว่างในไฟล์ / ไดเร็กทอรี
yuric

หนึ่งเพิ่มความฟุ่มเฟื่อยให้กับสิ่งนี้ได้อย่างไร? xargs -verbose svn rm?
TekiusFanatikus

1
เพียงคำแนะนำสำหรับผู้ใช้สคริปต์ ฯลฯ คำสั่งนี้จะล้มเหลวหากไม่พบไฟล์ที่จะลบ: svn: E205001: ลอง 'svn help delete' สำหรับข้อมูลเพิ่มเติม svn: E205001: มีอาร์กิวเมนต์ไม่เพียงพอ
Thorsten Schöning

1
@ ปัญหาThorstenSchöningสามารถได้รับการแก้ไขโดยการเพิ่ม-rไปยังxargsตัวเลือก (ไม่ทำงานถ้ามิได้โต้แย้งไม่ได้รับ) นอกจากนี้ numer ของการขัดแย้งควรจะ จำกัด -n 500และการลบควรจะเป็นแบทช์เพราะการภาวนาล้มเหลวด้วยจำนวนมากของไฟล์ที่จะลบเช่น และสุดท้าย แต่ไม่ท้ายสุดการอ้างอิงที่ดำเนินการนั้นไม่เหมาะสมสำหรับไฟล์ที่มีเชลล์พิเศษเช่น$- ใช้\nเป็นตัวคั่นได้ดีกว่าและปล่อยให้อ้างถึงxargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui


19

ขอบคุณ Paul Martin สำหรับเวอร์ชัน Windows

นี่คือการปรับเปลี่ยนสคริปต์เล็กน้อยเพื่อให้คำนึงถึงไฟล์ Windows ที่มีช่องว่างด้วย นอกจากนี้missing.listไฟล์จะถูกลบออกในตอนท้าย

ฉันบันทึกสิ่งต่อไปนี้ใน svndel.bat ในไดเรกทอรีถัง SVN ของฉัน (ตั้งค่าในสภาพแวดล้อม %% PATH ของฉัน) เพื่อให้สามารถเรียกจากโฟลเดอร์ใดก็ได้ที่พรอมต์คำสั่ง

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

ยินดีที่ได้เห็นรหัสแบทช์ใหม่ที่ยังคงปรากฏอยู่ :)
user230910

ว้าวคำตอบที่ดี ฉันกำลังจะไปกับ powershell แต่มันง่ายกว่ามาก
Jim Andrakakis

ฉันเพิ่มอีกบรรทัดหลังจากdel missing.list 2>NULนั้นเพราะฉันเพิ่มไฟล์ใหม่ทั้งหมดโดยตรงหลังจากลบไฟล์ที่ถูกลบครั้งแรกดังนั้นมันจึงถูกเพิ่มลงmissing.listใน svn: svn delete "missing.list"ใช้ได้กับฉัน
ปิแอร์

ฉันได้แก้ไขสคริปต์นี้เพื่อพยายามเรียกใช้จากตำแหน่งที่กำหนดเองแล้วพบปัญหานี้stackoverflow.com/questions/1137219/…ดังนั้นดูเหมือนว่าคุณต้องใช้ไดเรกทอรีการทำงานปัจจุบันเพื่อดำเนินการนี้
aolszowka

7

ฉันชอบตัวเลือก PowerShell ... แต่นี่เป็นอีกทางเลือกหนึ่งหากคุณใช้ Windows batch scripts:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

ทางเลือกอื่นที่ทำงานบน Linux (bash) สำหรับไฟล์ที่จะลบออกโดยไม่เว้นช่องว่างในพา ธ :

svn ลบ `สถานะ svn | grep! | awk "{พิมพ์ $ 2}" "

5

เป็นไปได้จริงที่จะลบออกmissing.listจาก user3689460 และ Paul Martin อย่างสมบูรณ์

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

สำหรับการอ้างอิง - นี่คือ DOS / cmd.exe ใน windows land
user230910

4

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

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done

4

การปรับเปลี่ยนบรรทัดคำสั่งเล็กน้อยซึ่งใช้งานได้บน Mac OS (หวังว่าจะเป็นบน Linux) และจัดการกับไฟล์คำสั่ง "svm sr" รายงานเช่น "! M" (หายไปและถูกแก้ไข)

มันจัดการกับช่องว่างในไฟล์

ขึ้นอยู่กับการแก้ไขคำตอบก่อนหน้านี้:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

2

เมื่อจัดการกับไฟล์จำนวนมากอาจเกิดขึ้นได้ว่าอินพุตอาร์กิวเมนต์ไปยัง xargs ยาวเกินไป ฉันไปใช้งานที่ไร้เดียงสามากขึ้นซึ่งก็ใช้ได้ผลในกรณีนั้นเช่นกัน

สำหรับ Linux:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

1

เวอร์ชันปรับปรุง

ดังนั้นคำสั่งเต็มคือ:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.