Çalışma kopyamdaki sürüm bilgisi olmayan / yoksayılan dosyaları / klasörleri nasıl silebilirim?


136

Subversion veri havuzunun çalışan bir kopyasına sahipsem, o çalışma kopyasındaki tüm sürümden veya yok sayılan dosyaları tek bir komut veya araçla silmenin bir yolu var mı? Aslında, SVN analogunu arıyorum git clean.

Komut satırı veya GUI çözümü (TortoiseSVN için) kabul edilebilir.


1
Olası
kopyayı

Yanıtlar:


98

TortoiseSVN'yi kullanma:


7
Güzel özellik! Bağlantıyı okumak zorunda kaldım, ancak XP'de sadece liste görünümünde (ağaç görünümünde değil) çalıştığını öğrenmek için - belki de cevabınıza eklemelisiniz.
Nick Meyer

5
Svn'nin komut satırı sürümü (özellikle pencerelerde) aynı işlevi sağlamıyor mu?
Mart'ta blong

3
Birinin aşağıda işaret ettiği gibi:svn cleanup --remove-unversioned --remove-ignored .
haui

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Bu aşağıdaki özelliklere sahiptir:

  • Yok sayılan ve izlenmeyen dosyalar silinir
  • Bir dosya adı boşluk içeriyor olsa bile çalışır (yeni satır hariç, ancak --xmlseçeneği kullanmak ve elde edilen xml çıktısını ayrıştırmak dışında bu konuda yapılabilecek çok şey yoktur )
  • svn statusDosya adından önce diğer durum karakterlerini yazdırsa bile çalışır (dosyalar izlenmediği için değil, her ihtimale karşı ...)
  • POSIX uyumlu herhangi bir sistemde çalışmalıdır

svncleanAşağıdakileri içeren bir kabuk komut dosyası kullanıyorum :

#!/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

2
Tam olarak aradığım şey linux ve MacOS'ta da bir cazibe gibi çalışıyor!
zengin

IFS'yi sıfırlamanız mı gerekiyor? Bir 'svnclean' senaryosu yapmamayı seçtim. Bu yüzden senaryonun geri kalanı için IFS'yi berbat edip etmeyeceğini merak ediyorum ...
C. Tewalt

3
@matrixugly: Hayır, IFSönceki haline geri dönmenize gerek yok . Bunu yaptığınızda VARNAME=value command, atama valueiçin VARNAMEsadece yürütülürken geçerlidir command(uygulanmaz bazı istisnalar dışında read). Daha fazla ayrıntı için POSIX spesifikasyonuna ve bu POSIX hata raporuna bakın.
Richard Hansen

@rich, bunu paylaştığın için teşekkürler. Birkaç yıl önce bir svn temizleme çözümü aradı ve ayrıca bazı kabuk komut dosyası bilgisi ile uzaklaştı! Açıkçası bu cevaba biraz geri dönüyorum.
C. Tewalt

120

Bu eski olduğunu biliyorum ama kimse üzerine tökezlemek durumunda, svn destek yeni sürümleri (1.9 veya üstü) --remove-unversioned, örneğin svn cleanup . --remove-unversioned.

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


18
Benim için doğru cevap bu. Platformlar arası bir komut satırı cevabı. Ayrıca, yok sayılan dosyalarısvn cleanup . --remove-ignored
Dan Atkinson

1
Svn 1.6 ve üstü sürümlerde çalışır.
wegry

2
Lütfen bunu 1.9 olarak değiştirin, ayrıca bkz. Subversion.apache.org/docs/release-notes/1.9.html (Yerel olarak denedim ve işe yaramadı ve
1.8.8'deyim

2
Sorun, sürümleri kaldırılmamış klasörleri kaldırmamasıdır .
Nyerguds

1
@Nyerguds: Doğru, bu sürümlenmemiş klasörleri değil, yalnızca sürümlendirilmemiş dosyaları siler. Başka çözüm bulan var mı?
dhiraj suvarna

42

Bu oneliner size yardımcı olabilir:

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

Dikkatli kullanın!


13
bu yok sayılan dosyaları kaldırmaz ve dosya adı boşluk içeriyorsa bozulur
Richard Hansen

1
Ayrıca yok sayılan dosyaları silmez
plaisthos

4
svn status --no-ignoreYoksayılan dosyaları iyi yakalamak için kullanabilirsiniz .
Kod

3
Aslında, isteğe bağlı olarak, yok sayılan dosyaları yerinde bırakmanın bir özelliği olduğunu düşünüyorum.
macetw

15

Yanal-Yves Fargialla ve gimpf'in cevaplarını Powershell kullanarak değiştirme (ancak Stackoverflow tarafından orijinal yayında yorum yapmasına izin verilmez):

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

Bu, satır başlangıcını belirtmek için "i" harfini içeren tüm dosyaların eşleştirilmesinden kaçınarak karat ("^") ekler. Ayrıca bu komutu etkileşimli olmayan ve bir komut dosyasında çok kullanışlı hale getirmek için -recurse ve -force öğelerine bayrakları ekleyin.


Komutun sonunda ekstra bir çift tırnak işareti gerekir. Sadece eklemeliyim, ancak düzenlemelerin görünüşe göre en az altı karakter olması gerekiyor.
Ian Miller

7

SVN'deki birçok şey, burada verilen çeşitli komut satırı cevapları ile kanıtlandığı gibi, farklı şekillerde yapılabilir. Versiyon 1.7'nin ortaya çıkmasıyla birlikte, TortoiseSVN için Stefan'ın verdiği cevaba göre daha iyi bir tane çözünürlüğü sağlayan başka bir teknik daha var, versiyonlanmamış dosyaları göz ardı edilen dosyalardan ayrı olarak seçmenize izin veriyor. TortoiseSvn >> Clean up...Bu iletişim kutusunu açmak için seçmeniz yeterlidir.

TornaiseSVN temizleme seçenekleri


7

Powershell ile:

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

Komut satırından:

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

3
Bu saf Windows komut dosyasını seviyorum! Bunun -match '[\?i]' -replace '^.{8}'yerine, bir dosya adı bir boşlukla başlasa bile doğru şekilde çalışan ve ayrıca yok sayılan dosyaları silen kullanmayı öneririm .
gimpf

1
Gimpf önerilen tweak kullanarak iyi çalışıyor, ancak bir ItemNotFoundException karşılaştığım bir durumda koştu. Görünüyor ki, svn durum sonuç kümesinde sadece tek bir dosya vardı. Bu değişiklik bu sorunu giderir: code@ (svn status --no-ignore) -match '[\? İ]' -değiştir '^. {8}' | rm `. Bu
yazıdan

1
ve bu sizi svn'de olmayan dizinler isteyeceğinden (recurse belirtilmediğinden), bir komut dosyasında kullanmak iyi değildir. Kullanım:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Bu oneliner benim için çalışıyor (şaşırtıcı derecede boşluk içeren dosyalar için işe yaramayan Richard Hansen'in cevabına dayanarak):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
sürümleri de silmek -friçin, rmkomuta ekleyin : svn status --no-ignore | grep '^ [I?]' | kes -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

TortoiseSVN'yi kullanma:

  1. Çalışan kopyanın köküne sağ tıklayın ve TortoiseSVN -> "değişiklikleri kontrol et" i seçin
  2. "Yok sayılan dosyaları göster" i seçin
  3. "Metin durumu" sütununa göre sırala
  4. şimdi hepsi birlikte gruplandırılmış olan "versiyonlanmamış" dosyalara gidin; hepsini seçin ve sağ tıklayın -> sil
  5. şimdi hepsi gruplandırılmış "yok sayılan" dosyalara gidin; hepsini seçin ve sağ tıklayın -> sil

Gerçekten güzel ve temiz bir çözüm değil, ama bildiğim en hızlı yol (Windows'ta).

Yok sayılan dosyalar ile pkh için teşekkürler.


Bunun yalnızca sürümlendirilmemiş dosyaları kaldıracağına inanıyorum. Yok sayılan öğeler etkilenmez.
Dirk Vollmar

2
İşleme iletişim kutusunu kullanmanıza gerek yoktur ve yok sayılan dosyaları alabilirsiniz: Sağ tıklayın | KaplumbağaSVN | Değişiklikleri kontrol edin. Ardından 'Yoksayılan Dosyaları Göster'i tıklayabilir ve uygun şekilde sıralayabilir / silebilirsiniz.
pkh

4

Bu, diğer yanıtlara benzer, ancak aslında yok sayılan dosyaları alır (RE'lerde 'I' not edin):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
dosya adı boşluk içeriyorsa bu sonlanır
Richard Hansen

4

Birisi Windows komut satırından yapamayacağınızı söyledi.

Boğa.

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

Tek satırda yapar ve tek bir GNU aracı gerektirmez. :)


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, sürümünüz özellikle öğrendiğim bir Jenkins "Windows toplu iş komutunu çalıştır" komutuna takılırsa kullanışlıdır, bir komut istemi değil, daha çok bir toplu komut dosyası gibi, bu nedenle %%aşırı ihtiyaç%
21

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.