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:
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.
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.
Jalankan status svn
Cari baris yang dimulai dengan "!" (hilang)
Cetak "--force" (argumen svn) dan kolom kedua (nama file) dari output dari # 2
Jalankan svn rmmenggunakan output # 3 sebagai argumen
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
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)
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
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
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:
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.)
sumber
svn up
? karena file dipulihkan dari server svnJika 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:
Referensi:
sumber
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 status
svn remove
setiap filesumber
-r
kexargs
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 untukxargs
: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 :
sumber
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.
sumber
del missing.list 2>NUL
, karena saya menambahkan semua file baru secara langsung setelah terlebih dahulu menghapus file yang dihapus sehingga ditambahkanmissing.list
ke svn:svn delete "missing.list"
berfungsi untuk sayaSaya suka opsi PowerShell ... Tapi ini opsi lain jika Anda menggunakan skrip batch Windows:
sumber
Alternatif yang bekerja di Linux (bash) untuk file yang akan dihapus tidak mengkompensasi ruang di jalur:
sumber
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".sumber
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:
sumber
Sebenarnya mungkin untuk menghapus sepenuhnya
missing.list
dari user3689460 dan Paul Martinsumber
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:
sumber
Versi yang ditingkatkan
Jadi perintah lengkapnya adalah:
sumber