2010-04-22 4 views
12

Bir kabuk komut dosyasında (linux/bash) standart adım adım sarmaya çalışıyorum ve yürütmenin nasıl yapılacağını anlayamıyorum. svn status bir şey verdi. ÖrneğinSVN: ve bash: Katılımsız değişiklikler olup olmadığını nasıl anlarım?

~/sandbox/$svn status 
?  pat/foo 
~/sandbox/$echo $? 
0 

ben foo dosyasını, daha sonra

svn status 

dönüş şey silmek, ancak echo $? hala kararsız değişiklikler varsa bazı adımlar yapamaz istiyorum 0

ise . İşaretçiler büyük beğeni topluyorlar.

cevap

2

Bir süre önce benzer bir şey uyguladık. svn status'un dönüş değerine güvenmemelisiniz, ancak bunun yerine çıktısını ayrıştırmalısınız. Örneğin, "M", "A", "D" vb. Ile başlayan satırları aramalısınız. Bu konuda size yardımcı olması için perl kullanabilirsiniz. Bu ayrıştırma sonucuna göre değişiklik olup olmadığını kesinlikle bileceksiniz.

Btw svn status için hiçbir değişiklik olmadığında 0 değil, tüm bu dönüş kodundan sonra hata olmadığına işaret eder.

6

Neden sonucu svn status -q'dan test etmiyorsunuz? gibi bir şey:

result=`svn status -q` 
[ -z "$result" ] && echo "No changes" && exit 1 

echo "Changes found" 
exit 0 

Eğer repo svn:externals kullanıyorsanız yorumlarınızı ve ek yöntemler için aşağıdaki yanıtlara bakın. hiçbiri

+2

Evet, bu fikri aldım ve çok benzer bir şeyle karşılaştım: [code] eğer [-z "$ (svn st)"]; daha sonra echo "çalışma kopyası bozulmamış" başka bir " echo" çalışma kopyası değişiklik içeriyor " exit; fi [/ code] – fishtoprecords

+1

@fishtoprecords, lütfen yanıt olarak gönderin. Kendi sorunuza bir cevap göndermek için sorun yok. – Nowaker

+1

Unutmayın - Eğer dışsallarınız varsa bunun işe yaramayacağını düşünüyorum. Çalışmak için '--ignore-externals 'ekleyebilirsin, ama tabiki bu dışsalları kontrol edemezsin (eğer bunu önemsersen). – histumness

3

Yoksa değişiklikler varsa 0 dönmelidir

svn status | grep [AMCDG] 
echo $? 

deneyebilirsiniz ve 1 Projeniz svn:externals referans içeriyorsa kabul edilen cevap çalışmaz. Bu durumda, çalışan kopyada yerel değişiklik yoksa bile, svn status -q hala çıktı üretecektir. Örneğin, benim proje her depo ayrı bir bölümünde muhafaza birkaç kütüphaneleri bağlıdır:

$ svn status -q 
X  Externals/ETCKit 
X  Externals/RulesParser 
X  Externals/XMLRPC 

Performing status on external item at 'Externals/ETCKit': 

Performing status on external item at 'Externals/XMLRPC': 

Performing status on external item at 'Externals/RulesParser': 

bu ek çıkışı için hesap için, ben awk kullanarak sona erdi:

if [[ -n $(svn status -q . | awk '$1 ~ /[!?ABCDGKLMORST]/') ]]; then 
    echo "The working copy at $(pwd) appears to have local modifications" 
fi 

Bu komut dosyası svn status -q çıktısını alır ve yerel bir değişikliği gösteren bir durum koduyla başlamayan satırları filtreler. Son sonuç boş dizeyse, çalışma kopyası temizdir.

+2

komutu şu olmalıdır: svn status | grep '^ [AMCDG]' – Speq

3

gelen svnversions ile revizyon numarasını test edebilirsiniz varsa

0

Kullandığım bir çözüm. Svn externals ile çalışır ve betiğinizde svn durumlarını açıkça listelemekten kaçınır (sizin bakış açınıza bağlı olarak iyi bir şey olabilir veya olmayabilir).

# tested with svn 1.6.11/bash 4.1.2 
if [ "$(svn st -q | cut -c -8 | sed '/^[^ ]*$/d' | grep -m 1 '[^ ]')" ]; then 
    echo "changes detected" 
fi 

svn st -q - Harici dizinler için X olmayan durumları listeler.
cut -c -8 - İlk 8 sütunun tümünü değil.
sed '/^[^ ]*$/d' - Dışsallarla çalışırken görülen 'Performans ...' satırlarını bırakır.
grep -m 1 '[^ ]' - boşluk olmayan ilk alan bir değişiklik yapılmasını gerektirir.