Perintah SVN untuk menghapus semua file yang hilang secara lokal

134

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 mana
sumber
1
Saya memelihara 1 folder yang berfungsi, dan 1 folder checkout. Dan hanya memindahkan file dari folder kerja ke folder check out. Jika folder harus ditambahkan / dihapus, saya melakukannya secara manual dan kemudian memindahkan file ke folder itu (misalnya paket baru, paket lama). Sebagian besar masalah svn terjadi ketika Anda memindahkan folder pada copy pekerjaan Anda. Bahkan ketika menyalin file dari copy pekerjaan Anda ke copy checkout, Anda seharusnya hanya memindahkan file, bukan folder.
Siddharth

Jawaban:

99

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 rmpada nama file itu.

(Posting blog Hapus semua file "hilang" dari copy pekerjaan SVN melakukan sesuatu yang serupa untuk Unix / Linux.)

Michael Sorens
sumber
apakah ada cara di eclipse menggunakan plugin subclipse? sangat buruk untuk memperbarui kemudian menemukannya dalam proyek dan menghapusnya lagi.
Stan
FYI, jika kata sandi subversi diperlukan di sini adalah sintaks: svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Cocok [1] --username user_name_here - password password_here}
Jeff
pertama-tama Anda harus komit setelah baris ini sebelum mengeksekusi svn up? karena file dipulihkan dari server svn
Pierre
Apakah tindakan ini akan menghapus file dari repositori juga?
Sebastián Ulloa
175

Jika Anda menggunakan Mac ( Darwin ) atau Linux, Anda dapat menyalurkan output dari perintah berikut ke svn rmsemua 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.

  1. Jalankan status svn
  2. Cari baris yang dimulai dengan "!" (hilang)
  3. Cetak "--force" (argumen svn) dan kolom kedua (nama file) dari output dari # 2
  4. Jalankan svn rmmenggunakan output # 3 sebagai argumen

Jadi perintah lengkapnya adalah:

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

Referensi:

Peter Ajtai
sumber
4
Ini tidak berfungsi jika ada spasi dalam nama file. Saya tidak tahu cukup awk untuk memperbaikinya.
bugloaf
2
Gunakan awk '{print " --force "$2"@"}'jika nama file Anda mengandung @(jika Anda seorang pengembang iOS misalnya)
Guillaume Algis
1
Dan menangani nama file dengan spasi putih, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'harus melakukan trik (dan mulai terlihat jelek)
Guillaume Algis
12
Perintah penuh untuk mengurus ruang adalah "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' xargs svn rm "
HelloWorld
1
Mengapa Anda tidak memasukkan --forcebagian xargs?
jwg
53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Saring hanya pada file yang hilang
  3. Potong poin seru
  4. Saring spasi spasi tambahan
  5. Tambahkan kutipan terkemuka
  6. Tambahkan kutipan tambahan
  7. svn remove setiap file
ivrin
sumber
Solusi ini berfungsi jika ada spasi di file / direktori.
yuric
Bagaimana seseorang menambahkan verbositas untuk ini? xargs -verbose svn rm?
TekiusFanatikus
1
Sekedar petunjuk bagi pengguna skrip, dll., Perintah ini gagal jika tidak ada file untuk dihapus ditemukan: svn: E205001: Coba 'svn bantu hapus' untuk informasi lebih lanjut svn: E205001: Tidak cukup argumen yang disediakan
Thorsten Schöning
1
@ Masalah ThorstenSchöning ini bisa diperbaiki dengan menambahkan -rke xargspilihan (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 \nsebagai pembatas dan biarkan mengutip untuk xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui
30

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/^!//' )
di mana
sumber
Bekerja untuk saya di OS X. Terima kasih :)
Gustavo de Souza
19

Terima kasih kepada Paul Martin untuk versi Windows.

Berikut ini sedikit modifikasi pada skrip sehingga file Windows dengan spasi juga diperhitungkan. Juga missing.listfile 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
pengguna3689460
sumber
senang melihat beberapa kode batch inovatif masih muncul :)
user230910
Wow, jawaban yang bagus. Aku akan pergi dengan PowerShell, tapi ini jauh lebih mudah.
Jim Andrakakis
Saya menambahkan baris lain setelah itu del missing.list 2>NUL, karena saya menambahkan semua file baru secara langsung setelah terlebih dahulu menghapus file yang dihapus sehingga ditambahkan missing.listke svn: svn delete "missing.list"berfungsi untuk saya
Pierre
Saya telah memodifikasi skrip ini untuk mencoba menjalankan dari lokasi yang sewenang-wenang kemudian menemui masalah ini stackoverflow.com/questions/1137219/… jadi sepertinya Anda HARUS menggunakan Direktori Kerja Saat Ini untuk melakukan tindakan ini.
aolszowka
7

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)
Paul Martin
sumber
5

Alternatif yang bekerja di Linux (bash) untuk file yang akan dihapus tidak mengkompensasi ruang di jalur:

svn hapus `svn status | grep! | awk '{print $ 2}' `
gilyen
sumber
4

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
warga negara1
sumber
4

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
Stefano Bossi
sumber
4

Sebenarnya mungkin untuk menghapus sepenuhnya missing.listdari user3689460 dan Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Amfasis
sumber
untuk referensi - ini adalah DOS / cmd.exe di windows land
user230910
2

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
Jonas Eberle
sumber
1

Versi yang ditingkatkan

Jadi perintah lengkapnya adalah:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Zeta
sumber