Bagaimana saya bisa menghapus semua file / folder tidak berversi / diabaikan dalam copy pekerjaan saya?

138

Jika saya memiliki copy pekerjaan dari repositori Subversion, apakah ada cara untuk menghapus semua file tidak berversi atau diabaikan dalam copy pekerjaan itu dengan satu perintah atau alat? Pada dasarnya, saya mencari analog SVN git clean.

Baik baris perintah atau solusi GUI (untuk TortoiseSVN) akan dapat diterima.

Nick Meyer
sumber
1
Kemungkinan duplikat dari secara otomatis menghapus file tidak berversi Subversion
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

98

Menggunakan TortoiseSVN:

Stefan
sumber
7
Fitur bagus! Saya harus membaca tautannya, untuk mengetahui bahwa itu hanya berfungsi pada tampilan daftar (bukan tampilan pohon) di XP - mungkin Anda harus memasukkannya ke dalam jawaban Anda.
Nick Meyer
5
Apakah versi baris perintah svn (khusus di windows) tidak menyediakan fungsi yang sama?
blong
5
Seperti yang ditunjukkan oleh sombody di bawah ini:svn cleanup --remove-unversioned --remove-ignored .
haui
135
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Ini memiliki beberapa fitur berikut:

  • File yang diabaikan dan tidak terlacak akan dihapus
  • Ini berfungsi bahkan jika nama file berisi spasi (kecuali untuk baris baru, tetapi tidak banyak yang dapat dilakukan tentang itu selain menggunakan --xmlopsi dan mengurai keluaran xml yang dihasilkan)
  • Ini berfungsi bahkan jika svn statusmencetak karakter status lain sebelum nama file (yang seharusnya tidak karena file tidak dilacak, tetapi untuk berjaga-jaga ...)
  • Ini harus bekerja pada sistem yang sesuai dengan POSIX

Saya menggunakan skrip shell bernama svncleanyang berisi berikut ini:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done
Richard Hansen
sumber
2
Persis yang saya cari, bekerja seperti pesona juga di linux dan MacOS!
kaya
Apakah Anda perlu mengatur ulang IFS? Saya memilih untuk tidak membuat skrip 'svnclean'. jadi saya ingin tahu apakah itu akan mengacaukan IFS untuk sisa skrip ...
C. Tewalt
3
@ Matrixugly: Tidak, Anda tidak perlu mengubah IFSkembali seperti sebelumnya. Jika Anda melakukannya VARNAME=value command, penetapan valueke VARNAMEhanya berlaku selama eksekusi command(dengan beberapa pengecualian yang tidak berlaku untuk read). Lihat spesifikasi POSIX dan laporan bug POSIX ini untuk lebih jelasnya.
Richard Hansen
@rich, terima kasih telah membagikan ini. Datang mencari solusi pembersihan svn beberapa tahun yang lalu, dan juga pergi dengan beberapa pengetahuan skrip shell! Rupanya saya telah kembali ke jawaban ini sedikit.
C. Tewalt
125

Saya tahu ini sudah lama tetapi jika ada orang lain yang menemukannya, versi yang lebih baru (1.9 atau yang lebih baru) dari dukungan svn --remove-unversioned, misalnya svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options

Neil
sumber
19
Bagi saya, inilah jawaban yang tepat. Ini adalah jawaban baris perintah lintas platform. Selain itu, Anda dapat menghapus file yang diabaikan dengansvn cleanup . --remove-ignored
Dan Atkinson
1
Bekerja di svn 1.6 dan lebih tinggi.
Wegry
3
Harap ubah menjadi 1.9, lihat juga subversion.apache.org/docs/release-notes/1.9.html (Saya mencoba secara lokal dan tidak berhasil, dan saya menggunakan 1.8.8)
ikku100
2
Tampaknya masalahnya adalah ia tidak menghapus folder tidak berversi .
Nyerguds
1
@Nyerguds: Benar, ini tidak menghapus folder yang tidak berversi, tetapi hanya file yang tidak berversi. Adakah yang menemukan solusi?
dhiraj suvarna
43

Oneliner ini mungkin bisa membantu Anda:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

Gunakan dengan hati-hati!

jkramer.dll
sumber
13
ini tidak menghapus file yang diabaikan dan akan rusak jika nama file berisi spasi
Richard Hansen
1
Itu juga tidak menghapus file yang diabaikan
plaisthos
4
Anda dapat menggunakan svn status --no-ignoreuntuk menangkap file yang diabaikan dengan baik.
Kode
3
Bahkan, saya menganggapnya sebagai fitur untuk membiarkan file yang diabaikan, secara opsional.
macetw
15

Memodifikasi jawaban Yanal-Yves Fargialla dan gimpf menggunakan Powershell (tetapi tidak diizinkan untuk mengomentari kiriman asli oleh Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Ini menambahkan carat ("^") untuk menentukan awal baris, menghindari pencocokan semua file yang berisi huruf "i". Tambahkan juga tanda untuk -recurse dan -force to rm untuk membuat perintah ini non-interaktif dan dapat digunakan dalam skrip.

gwilk.dll
sumber
Perintah tersebut membutuhkan tanda kutip ganda tambahan di bagian akhir. Saya baru saja menambahkannya, tetapi pengeditan setidaknya harus terdiri dari enam karakter.
Ian Miller
7

Banyak hal di SVN dapat dilakukan dengan berbagai cara, sebagaimana dibuktikan dengan beragam jawaban baris perintah yang diberikan di sini. Dengan munculnya versi 1.7, ada lagi teknik lain untuk TortoiseSVN yang, pada kenyataannya, menyediakan resolusi butir yang lebih baik daripada jawaban Stefan yang disediakan, membiarkan Anda memilih file non-berversi secara terpisah dari file yang diabaikan. Cukup pilih TortoiseSvn >> Clean up...untuk membuka dialog ini.

Opsi pembersihan TortoiseSVN

Michael Sorens
sumber
7

Dengan PowerShell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

Dari baris perintah:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
Yanal-Yves Fargialla
sumber
3
Saya suka skrip Windows murni ini! Saya akan merekomendasikan menggunakan -match '[\?i]' -replace '^.{8}'sebagai gantinya, yang berfungsi dengan benar bahkan jika nama file dimulai dengan spasi, dan juga menghapus file yang diabaikan.
gimpf
1
Menggunakan tweak yang disarankan gimpf berfungsi dengan baik, tetapi saya mengalami kasus di mana saya menemukan ItemNotFoundException. Ternyata, hanya ada satu file di hasil set status svn. Perubahan ini memperbaiki masalah tersebut: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `.
Mengetahui
1
dan karena itu akan meminta Anda untuk direktori yang tidak ada di svn (karena recurse tidak ditentukan), itu tidak baik untuk digunakan dalam skrip. Gunakan:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber
6

Oneliner ini berfungsi untuk saya (berdasarkan jawaban Richard Hansen, yang secara mengejutkan tidak berfungsi untuk file yang berisi spasi):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
Dennis Golomazov
sumber
2
untuk menghapus folder tidak berversi juga, tambahkan -frke rmperintah: svn status --no-ignore | grep '^ [I?]' | potong -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov
5

Menggunakan TortoiseSVN:

  1. Klik kanan pada root copy pekerjaan dan pilih TortoiseSVN -> "periksa modifikasi"
  2. Pilih "Tampilkan file yang diabaikan"
  3. Urutkan berdasarkan kolom "Status teks"
  4. gulir ke file "tidak berversi", sekarang semuanya dikelompokkan menjadi satu; pilih semuanya dan klik kanan -> hapus
  5. gulir ke file "diabaikan", sekarang semua dikelompokkan menjadi satu; pilih semuanya dan klik kanan -> hapus

Bukan solusi yang bagus dan bersih, tetapi cara tercepat yang saya ketahui (di Windows).

Terima kasih kepada pkh untuk tip dengan file yang diabaikan.

Thomas Lötzer
sumber
Saya yakin ini hanya akan menghapus file non-berversi. Item yang diabaikan tidak akan terpengaruh.
Dirk Vollmar
2
Anda tidak perlu menggunakan dialog komit, dan Anda bisa mendapatkan file yang diabaikan: Klik kanan | TortoiseSVN | Periksa Modifikasi. Kemudian Anda dapat mengklik 'Tampilkan File yang Diabaikan' dan urutkan / hapus dengan benar.
pkh
4

Ini mirip dengan jawaban lain, tetapi sebenarnya mendapatkan file yang diabaikan (perhatikan 'I' di RE):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
pkh
sumber
1
ini rusak jika nama file berisi spasi
Richard Hansen
4

Seseorang berkata Anda tidak dapat melakukannya dari baris perintah Windows.

Banteng.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Melakukannya dalam satu baris dan tidak memerlukan alat GNU tunggal. :)

ChokesMcGee
sumber
for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas
@DarienPardinas, versi Anda sangat berguna jika menghubungkan ke Jenkins "Jalankan perintah batch Windows", yang baru saja saya pelajari bukanlah prompt perintah tetapi lebih seperti skrip batch, oleh karena itu kebutuhan untuk %%over%
jxramos
1

Anda tidak dapat menghapusnya hanya dengan baris perintah SVN (meskipun tidak yakin tentang alat GUI) jika Anda menggunakan sistem linux, ini mungkin membantu:

http://www.guyrutenberg.com/2008/01/18/delete-unversioned-files-under-svn/

Metode (brutal) lainnya adalah melakukan perubahan, menghapus semua dari folder dan checkout lagi.

Juriy
sumber