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.)
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.)
Yanıtlar:
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 rm
bu 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.)
svn up
? çünkü dosyalar svn sunucusundan geri yüklendi
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.
svn rm
# 3'ün çıktısını bağımsız değişken olarak kullanarak çalıştırınYani tam komut:
svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm
Referanslar:
awk '{print " --force "$2"@"}'
Dosya adınız bir @
(örneğin bir iOS geliştiriciyseniz) içeriyorsa kullanın
awk '{$1=""; print " --force \""substr($0,2)"@\"" }'
, hile yapmalısınız (ve çirkin görünmeye başlar)
--force
xargs kısmına koymuyorsunuz?
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
svn status
svn remove
her dosya-r
için xargs
seç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 $
- \n
ayırıcı olarak daha iyi kullanın ve xargs
svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
Bunu buldum, bu da işe yarıyor : SVN çalışan bir kopyasından tüm "eksik" dosyaları kaldırın :
svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )
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.list
dosya 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
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ı
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)
Bu kabuk betiği, svn status
projenizdeki ( ) 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
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
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")
Ç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