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.)


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.)


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:


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

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


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

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)

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}' `

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

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

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")

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

1

Versi yang ditingkatkan

Jadi perintah lengkapnya adalah:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.