ใน SVN มีคำสั่งที่ฉันสามารถใช้เพื่อลบไฟล์ที่หายไปทั้งหมดในไดเร็กทอรีหรือไม่
หรือล้มเหลววิธีการบางอย่างในการแสดงเฉพาะไฟล์ที่หายไป (หรือในกรณีทั่วไปมีสถานะ A, D,? ฯลฯ )
ใน SVN มีคำสั่งที่ฉันสามารถใช้เพื่อลบไฟล์ที่หายไปทั้งหมดในไดเร็กทอรีหรือไม่
หรือล้มเหลววิธีการบางอย่างในการแสดงเฉพาะไฟล์ที่หายไป (หรือในกรณีทั่วไปมีสถานะ A, D,? ฯลฯ )
คำตอบ:
หากคุณกำลังใช้ TortoiseSVN เพียงทำตรวจสอบการแก้ไขเรียงลำดับโดยสถานะคอลัมน์เลือกรายการทั้งหมดที่มีเครื่องหมายmissing
คลิกขวาเพื่อเปิดเมนูบริบทและเลือกลบ สุดท้ายตกลงที่จะเผยแพร่การเปลี่ยนแปลงไปยังที่เก็บ
หากคุณใช้ Windows แต่ชอบบรรทัดคำสั่งและสนุกกับการเล่น PowerShell หนึ่งซับนี้จะทำเคล็ดลับ:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
นั่นคือกรองเอาต์พุตให้เหลือเฉพาะบรรทัดที่แสดงไฟล์ที่หายไป (แสดงด้วยเครื่องหมายอัศเจรีย์ที่จุดเริ่มต้นของบรรทัด) จับชื่อไฟล์ที่เกี่ยวข้องและดำเนินการsvn rm
กับชื่อไฟล์นั้น
(บล็อกโพสต์ลบไฟล์ที่“ หายไป” ทั้งหมดออกจากสำเนาที่ใช้งาน SVNจะทำสิ่งที่คล้ายกันสำหรับ Unix / Linux)
svn up
หรือไม่? เนื่องจากไฟล์ถูกกู้คืนจากเซิร์ฟเวอร์ svn
หากคุณใช้ Mac ( Darwin ) หรือ Linux คุณสามารถไพพ์เอาต์พุตของคำสั่งต่อไปนี้svn rm
สำหรับไฟล์ที่หายไปทั้งหมด คุณสามารถตั้งค่าไดเร็กทอรีการทำงานปัจจุบันเป็นไดเร็กทอรีหรือไดเร็กทอรีย่อยที่เหมาะสมก่อนที่จะรันไดเร็กทอรีเหล่านี้ - ขึ้นอยู่กับว่าคุณต้องการรันสำเนาการทำงานทั้งหมดของคุณหรือเฉพาะเซ็ตย่อย
svn rm
โดยใช้ผลลัพธ์ของ # 3 เป็นอาร์กิวเมนต์ดังนั้นคำสั่งเต็มคือ:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
อ้างอิง:
awk '{print " --force "$2"@"}'
ถ้าชื่อไฟล์ของคุณมี a @
(ถ้าคุณเป็นนักพัฒนา iOS)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
ควรทำเคล็ดลับ (และเริ่มดูน่าเกลียด)
--force
เข้าไปในส่วน xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
แต่ละไฟล์-r
ไปยังxargs
ตัวเลือก (ไม่ทำงานถ้ามิได้โต้แย้งไม่ได้รับ) นอกจากนี้ numer ของการขัดแย้งควรจะ จำกัด -n 500
และการลบควรจะเป็นแบทช์เพราะการภาวนาล้มเหลวด้วยจำนวนมากของไฟล์ที่จะลบเช่น และสุดท้าย แต่ไม่ท้ายสุดการอ้างอิงที่ดำเนินการนั้นไม่เหมาะสมสำหรับไฟล์ที่มีเชลล์พิเศษเช่น$
- ใช้\n
เป็นตัวคั่นได้ดีกว่าและปล่อยให้อ้างถึงxargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
ฉันเพิ่งพบสิ่งนี้ซึ่งเป็นเคล็ดลับลบไฟล์ที่ "หายไป" ทั้งหมดออกจากสำเนาที่ใช้งาน SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
ขอบคุณ 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
del missing.list 2>NUL
นั้นเพราะฉันเพิ่มไฟล์ใหม่ทั้งหมดโดยตรงหลังจากลบไฟล์ที่ถูกลบครั้งแรกดังนั้นมันจึงถูกเพิ่มลงmissing.list
ใน svn: svn delete "missing.list"
ใช้ได้กับฉัน
ฉันชอบตัวเลือก PowerShell ... แต่นี่เป็นอีกทางเลือกหนึ่งหากคุณใช้ Windows batch scripts:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
ทางเลือกอื่นที่ทำงานบน Linux (bash) สำหรับไฟล์ที่จะลบออกโดยไม่เว้นช่องว่างในพา ธ :
svn ลบ `สถานะ svn | grep! | awk "{พิมพ์ $ 2}" "
เป็นไปได้จริงที่จะลบออกmissing.list
จาก user3689460 และ Paul Martin อย่างสมบูรณ์
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
เชลล์สคริปต์นี้ตรวจสอบ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
การปรับเปลี่ยนบรรทัดคำสั่งเล็กน้อยซึ่งใช้งานได้บน 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
เมื่อจัดการกับไฟล์จำนวนมากอาจเกิดขึ้นได้ว่าอินพุตอาร์กิวเมนต์ไปยัง 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
เวอร์ชันปรับปรุง
ดังนั้นคำสั่งเต็มคือ:
svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm