2011-11-14 29 views
48

git commit numaralı bir kumaş senaryosunu yazmaya çalışıyorum; Ancak, yapılacak hiçbir şey yoksa, git 1 durumundan çıkar. Dağıtım betiği başarısız olarak alır ve çıkar. gerçek başarısızlıklarını algılamak istiyorum, bu yüzden git commit arızaları için bir battaniye görmezden gelemem. Dağıtımın devam edebileceği, ancak gerçek bir işlem başarısız olduğunda ortaya çıkan hataları yakalayabilmesi için boş taahhütlerin göz ardı edilmesine nasıl izin verebilirim? git commit adam sayfasındanHata olmadan hiçbir şey yapmaya ne dersin?

def commit(): 
    local("git add -p && git commit") 

cevap

69

Git koşulunu daha önce git diff'in çıkış kodunu kontrol ederek kontrol et. (Kabuk) Örneğin

:

git add -A 
git diff-index --quiet HEAD || git commit -m 'bla' 

DÜZENLEME: Holger'in açıklama göre sabit git diff komut.

+47

'git diff' komut dosyası için kullanılmaması gereken bir" porselen "komutudur. En çok istediğin şey 'git diff-index --quiet HEAD || git taahhüdü -m 'bla'. Ayrıca bkz. [Bu cevap] (http://stackoverflow.com/a/2659808/659002). – Holger

+0

Daha fazlasını açıklamak için 'git diff --quiet --exit-code --cached' ile ilgili sorun, yalnızca 1 '(false) olarak değerlendirileceğidir, yalnızca işlem için düzenlenmemiş değiştirilmiş dosyalar (unadded files)). Yükseltilen yorum yeni dosya ve silme işlemlerini hesaba katmak için en iyi çözümdür. –

+0

'git diff-index --quiet HEAD hakkında yorum || git commit -m 'bla' bu soruya cevap olmalı. –

41

:

--allow-empty 
    Usually recording a commit that has the exact same tree as its 
    sole parent commit is a mistake, and the command prevents you 
    from making such a commit. This option bypassesthe safety, and 
    is primarily for use by foreign SCM interface scripts. 
+26

Bu aslında bir taahhüt oluşturur. – ThiefMaster

+5

@ThiefMaster: Doğru. OP'den bunun bir sorun olup olmadığını söyleyemem. Otomatik işlemlerden yararlanıyorsanız, geçmişinizin temiz olmasını umursamıyorsunuzdur. –

+1

Kaçınılması mümkün değilse bunu yapmamayı tercih ederim. Bunu yapmanın bir yolu var mı? – kojiro

6
with settings(warn_only=True): 
    run('git commit ...') 

Bu başarısızlık görmezden kumaşı neden olur. Boş taahhütler oluşturmamanın avantajı vardır.

Çıktının tamamen bastırılması için ek bir with hide('warnings'): katmanı sarabilirsiniz, aksi halde kumaş çıktısında işlemin başarısız olduğunu (ancak fab dosyasının çalışmaya devam ettiğini) bir not alırsınız.

+0

OP yazdı "Algılamak istiyorum * gerçek * başarısızlık-işlemek için"; Bu kod gizlenecek tüm * hataları * gizleyecektir. – bfontaine

-3

bebeği deneyin!

from fabric.api import local 
from fabric.colors import green 


def commit(message='updates'): 
    try: 
     local('git add .') 
     local('git commit -m "' + message + '"') 
     local('git push') 
     print(green('Committed and pushed to git.', bold=False)) 
    except: 
     print(green('Done committing, likely nothing new to commit.', bold=False)) 
+6

Neden reddedildiğinizi açıklamak için: Yakalamak istediğiniz başka hatalar olabilir. Bir hata durumunda, hiçbir şeyin yapılması gerekmediğini varsaymak istemezsiniz.- Ayrıca, ancak bu ilişkisizdir: Asla bir jenerik 'except:' kullanmayın, istisna hariç 'istisna'yı kullanın. – Albert

İlgili konular