Yerel olarak eksik tüm dosyaları silmek için SVN komutu


134

SVN'de, bir dizindeki tüm yerel olarak eksik dosyaları silmek için kullanabileceğim bir komut var mı?

Ya da başarısız olursa, yalnızca eksik olan dosyaları listelemenin bir yolu (veya daha genel durumda, A, D,?, Vb.)


1
1 çalışma klasörü ve 1 ödeme klasörü tutuyorum. Ve yalnızca dosyaları çalışma klasöründen teslim alma klasörüne taşıyın. Bir klasörün eklenmesi / kaldırılması gerekiyorsa, bunu manuel olarak yapıyorum ve ardından dosyaları bu klasöre taşıyorum (örneğin yeni paketler, eski paketler). Çoğu svn sorunu, çalışma kopyanızda klasörleri taşıdığınızda ortaya çıkar. Dosyaları çalışma kopyanızdan kullanıma alma kopyasına kopyalarken bile, klasörleri değil yalnızca dosyaları taşımalısınız.
Siddharth

Yanıtlar:


99

TortoiseSVN kullanıyorsanız, sadece bir Değişiklikleri Kontrol Edin , Durum sütununa göre sıralayın , işaretlenen tüm girişleri seçin missing, sağ tıklayarak içerik menüsünü açın ve Sil'i seçin . Son olarak, değişiklikleri depoda yayınlamayı taahhüt edin.

Windows kullanıyorsanız, ancak komut satırını tercih ediyorsanız ve PowerShell ile uğraşmaktan hoşlanıyorsanız, bu tek satırlık program hile yapacak:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Diğer bir deyişle, çıktıyı yalnızca eksik dosyaları gösteren satırlara (satırın başında bir ünlem işaretiyle gösterilir) filtreleyin, ilişkili dosya adını yakalayın ve svn rmbu dosya adı üzerinde bir işlem yapın.

(Blog gönderisi Çalışan bir SVN kopyasından tüm "eksik" dosyaları kaldırın Unix / Linux için benzer bir şey yapar.)


tutulmada subclipse eklentisi kullanmanın bir yolu var mı? a'yı güncellemek sonra projede bulmak ve tekrar silmek çok kötü.
Stan

Bilginize, bir alt sürüm şifresi gerekliyse, burada sözdizimi şu şekildedir: svn durumu - kullanıcıadı kullanıcı_adı_burada - şifre şifre_burada | ? {$ _ - '^! \ s + (. *)'} | % {svn rm $ Eşleşir [1] - kullanıcı adı user_name_here - password password_here}
Jeff

yürütmeden önce bu satırdan sonra taahhüt etmelisiniz svn up? çünkü dosyalar svn sunucusundan geri yüklendi
Pierre

Bu işlem, dosyaları havuzdan da silecek mi?
Sebastián Ulloa

176

Mac ( Darwin ) veya Linux kullanıyorsanız svn rm, tüm eksik dosyalar için aşağıdaki komutların çıktılarını aktarabilirsiniz. Geçerli çalışma dizinini, bunları çalıştırmadan önce uygun dizine veya alt dizine ayarlayabilirsiniz - bunu tüm çalışma kopyanızın mı yoksa yalnızca bir alt kümenin mi çalıştıracağına bağlı olarak.

  1. Bir svn durumu çalıştır
  2. "!" İle başlayan satırları arayın. (eksik)
  3. # 2'den çıktının "--force" (svn bağımsız değişkeni) ve ikinci sütununu (dosya adı) yazdırın
  4. svn rm# 3'ün çıktısını bağımsız değişken olarak kullanarak çalıştırın

Yani tam komut:

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

Referanslar:


4
Dosya adında boşluklar varsa bu işe yaramaz. Yine de düzeltmek için yeterince beceriksiz bilmiyorum.
bugloaf

2
awk '{print " --force "$2"@"}'Dosya adınız bir @(örneğin bir iOS geliştiriciyseniz) içeriyorsa kullanın
Guillaume Algis

1
Ve bir dosya adını boşluk (lar) ile işleyin awk '{$1=""; print " --force \""substr($0,2)"@\"" }', hile yapmalısınız (ve çirkin görünmeye başlar)
Guillaume Algis

12
Alanla ilgilenen tam komut "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
HelloWorld

1
Neden --forcexargs kısmına koymuyorsunuz?
jwg

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Yalnızca eksik dosyalara filtre uygulayın
  3. Ünlem işaretini kes
  4. Sondaki beyaz boşlukları filtreleyin
  5. Önde gelen alıntı ekleyin
  6. Sondaki alıntı ekle
  7. svn remove her dosya

Bu çözüm, dosyalarda / dizinlerde boşluklar varsa işe yarar.
yuric

Kişi buna nasıl ayrıntı katar? xargs -verbose svn rm?
TekiusFanatikus

1
Yalnızca komut dosyası kullanıcıları için bir ipucu, silinecek dosya bulunmazsa bu komut başarısız olur: svn: E205001: Daha fazla bilgi için 'svn yardım silmeyi' deneyin svn: E205001: Yeterli argüman sağlanmadı
Thorsten Schöning

1
ThorstenSchöning sorunu ekleyerek sabitlenebilir @ -riçin xargsseçenekler (çalışmaz, eğer ne de bir argüman belirtilmemişse). Ek olarak, argüman sayısı sınırlandırılmalı ve kaldırmalar toplu olarak yapılmalıdır, çünkü çağrı çok fazla sayıda dosya kaldırılamadığından, örn -n 500. Ve son olarak, en az değil, örneğin $- \nayırıcı olarak daha iyi kullanın ve xargssvn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
alıntıyı


19

Windows sürümü için Paul Martin'e teşekkürler.

Burada, komut dosyasında küçük bir değişiklik var, böylece boşluklu Windows dosyaları da hesaba katılır. Ayrıca missing.listdosya sonunda kaldırılacaktır.

Aşağıdakini svndel.bat'a SVN bin dizinime (%% PATH ortamımda ayarlı) kaydettim, böylece komut isteminde herhangi bir klasörden çağrılabilir.

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

bazı yenilikçi toplu kodların hala göründüğünü görmek güzel :)
user230910

Vay canına, harika cevap. Powershell ile gitmek üzereydim ama bu çok daha kolaydı.
Jim Andrakakis

Daha sonra başka bir satır ekledim del missing.list 2>NUL, çünkü ilk önce silinen dosyaları kaldırdıktan sonra tüm yeni dosyaları doğrudan ekledim missing.list, böylece svn: svn delete "missing.list"benim için çalıştı
Pierre

Bu komut dosyasını rastgele bir konumdan çalıştırmayı denemek için değiştirdim ve bu sorunla karşılaştım stackoverflow.com/questions/1137219/…, bu nedenle bu eylemi gerçekleştirmek için Geçerli Çalışma Dizini'ni kullanmanız GEREKİR.
aolszowka

7

PowerShell seçeneğini beğendim ... Ancak Windows toplu komut dosyalarını kullanıyorsanız işte başka bir seçenek:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

Yolda boşluk içermeyen kaldırılacak dosyalar için Linux (bash) üzerinde çalışan bir alternatif:

svn `svn durumunu sil | grep! | awk '{baskı $ 2}' '

4

Bu kabuk betiği, svn statusprojenizdeki ( ) dizinlerini özyinelemeli olarak inceler , eksik dosyaları kaldırır (soru gerektirdiğinde) ve depoya yeni dosyalar ekler. Bu, bir tür "projenin mevcut anlık görüntüsünü depoya depolamaktır".

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

Mac OS'de (umarız Linux'ta bile) çalışan ve "svm sr" komutunun "! M" (eksik ve değiştirilmiş) gibi raporlarla başa çıkabilen komut satırında küçük bir değişiklik.

Dosyalardaki boşluklarla baş eder.

Önceki bir cevabın değiştirilmesine dayanmaktadır:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

Aslında missing.list, user3689460 ve Paul Martin'den tamamen kaldırmak mümkündür.

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

referans için - bu, Windows arazisindeki DOS / cmd.exe'dir
user230910

2

Çok sayıda dosya ile uğraşırken, xargs'a yapılan argüman girdisi çok uzun sürebilir. Bu durumda da işe yarayan daha naif bir uygulamaya gittim.

Bu Linux içindir:

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

Gelişmiş versiyon

Yani tam komut:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
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.