Di SVN apakah ada perintah yang bisa saya gunakan untuk menghapus semua file yang hilang secara lokal di direktori?
Atau gagal itu, beberapa cara daftar hanya file-file yang hilang (atau, dalam kasus yang lebih umum, berstatus A, D,?, Dll.)
Di SVN apakah ada perintah yang bisa saya gunakan untuk menghapus semua file yang hilang secara lokal di direktori?
Atau gagal itu, beberapa cara daftar hanya file-file yang hilang (atau, dalam kasus yang lebih umum, berstatus A, D,?, Dll.)
Jawaban:
Jika Anda menggunakan TortoiseSVN, cukup lakukan Pemeriksaan Modifikasi , urutkan berdasarkan kolom Status , pilih semua entri yang ditandai missing
, klik kanan untuk membuka menu konteks, dan pilih Hapus . Akhirnya, komit untuk mempublikasikan perubahan ke repositori.
Jika Anda menggunakan Windows, tetapi lebih suka baris perintah dan menikmati mencoba-coba di PowerShell, one-liner ini akan melakukan trik:
svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }
Yaitu, filter output ke hanya baris yang menampilkan file yang hilang (dilambangkan dengan tanda seru di awal baris), tangkap nama file yang terkait, dan lakukan svn rm
pada nama file itu.
(Posting blog Hapus semua file "hilang" dari copy pekerjaan SVN melakukan sesuatu yang serupa untuk Unix / Linux.)
svn up
? karena file dipulihkan dari server svn
Jika Anda menggunakan Mac ( Darwin ) atau Linux, Anda dapat menyalurkan output dari perintah berikut ke svn rm
semua file yang hilang. Anda dapat mengatur direktori kerja saat ini ke direktori atau subdirektori yang sesuai sebelum menjalankannya - tergantung pada apakah Anda ingin menjalankan ini seluruh copy pekerjaan Anda, atau hanya sebagian.
svn rm
menggunakan output # 3 sebagai argumenJadi perintah lengkapnya adalah:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Referensi:
awk '{print " --force "$2"@"}'
jika nama file Anda mengandung @
(jika Anda seorang pengembang iOS misalnya)
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
harus melakukan trik (dan mulai terlihat jelek)
--force
bagian xargs?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
setiap file-r
ke xargs
pilihan (tidak menjalankan, jika tidak argumen yang diberikan). Selain itu, jumlah argumen harus dibatasi dan penghapusan harus dikelompokkan karena doa gagal dengan jumlah file yang sangat besar untuk dihapus, misalnya -n 500
. Dan last but not least, kuotasi yang dilakukan adalah suboptimal untuk file yang berisi spesial shell seperti $
- lebih baik digunakan \n
sebagai pembatas dan biarkan mengutip untuk xargs
:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Saya baru saja menemukan ini, yang cukup membantu, Hapus semua file "hilang" dari copy pekerjaan SVN :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
Terima kasih kepada Paul Martin untuk versi Windows.
Berikut ini sedikit modifikasi pada skrip sehingga file Windows dengan spasi juga diperhitungkan. Juga missing.list
file yang akan dihapus di akhir.
Saya menyimpan yang berikut ini di svndel.bat di direktori bin SVN saya (disetel di lingkungan %% PATH saya) sehingga dapat dipanggil dari folder mana saja pada command prompt.
### 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
, karena saya menambahkan semua file baru secara langsung setelah terlebih dahulu menghapus file yang dihapus sehingga ditambahkan missing.list
ke svn: svn delete "missing.list"
berfungsi untuk saya
Saya suka opsi PowerShell ... Tapi ini opsi lain jika Anda menggunakan skrip batch Windows:
svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Script shell ini, secara rekursif memeriksa ( svn status
) direktori dalam proyek Anda, menghapus file yang hilang (sesuai permintaan pertanyaan) dan menambahkan file baru ke repositori. Ini semacam "menyimpan ke dalam snapshot proyek saat ini".
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
Sedikit modifikasi dari baris perintah, yang bekerja pada Mac OS (semoga bahkan di Linux) dan mengatasi dengan file yang dilaporkan oleh perintah "svm sr", seperti "! M" (hilang dan dimodifikasi).
Ini mengatasi spasi di file.
Ini didasarkan pada modifikasi dari jawaban sebelumnya:
svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
Sebenarnya mungkin untuk menghapus sepenuhnya missing.list
dari user3689460 dan Paul Martin
for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Ketika berhadapan dengan banyak file, bisa jadi input argumen ke xargs menjadi terlalu panjang. Saya pergi untuk implementasi yang lebih naif yang bekerja dalam kasus itu juga.
Ini untuk 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