Hata olmadan hiçbir şey kaydetmeme


91

Bir kumaş senaryosu yazmaya çalışıyorum git commit; ancak, işlenecek bir şey yoksa git, durumuyla çıkar 1. Konuşlandırma betiği bunu başarısız olarak alır ve çıkar. Gerçekleştirilecek başarısızlıkları tespit etmek istiyorum , bu yüzden kumaşa git commitbaşarısızlıkları görmezden gelemeyeceğim . Dağıtmanın devam edebilmesi, ancak gerçek bir kaydetme başarısız olduğunda ortaya çıkan hataları yakalamaya devam edebilmesi için boş kesinleştirme hatalarının yok sayılmasına nasıl izin verebilirim?

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

Yanıtlar:


154

Git diff'in çıkış kodunu kontrol ederek bu koşulu önceden yakalayın.

Örneğin (kabukta):

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

DÜZENLEME: git diffHolger'ın yorumuna göre sabit komut.


64
Not git diffkomut dosyası için kullanılmamalıdır bir "porselen" komuttur. En çok istediğin şey git diff-index --quiet HEAD || git commit -m 'bla'. Bu yanıta da bakın .
Holger

1
Daha fazla açıklamak gerekirse, sorun, yalnızca commit için hazırlanmamış değiştirilmiş dosyalar (eklenmemiş dosyalar) git diff --quiet --exit-code --cachediçin 1(false) olarak değerlendirilmesidir . Yukarı oylanan yorum, yeni dosyaları ve silmeleri hesaba katmak için en iyi çözümdür.
Jorge Bucaran

2
Hakkındaki yorum git diff-index --quiet HEAD || git commit -m 'bla'bu soruya bir cevap olmalıdır.
Rakib

1
Tobi cevabını Holger'ın yorumuna göre düzeltmek istemediğinden, cevabını kendim düzenledim.
25'te vog

Git diff-index --quiet HEAD'in yerel deponun orijinle güncel olup olmadığını test etmediğini unutmayın.
bortzmeyer

62

Gönderen git commitadam sayfası:

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

41
Bu aslında bir commit yaratacaktır.
ThiefMaster

6
@ThiefMaster: Doğru. OP'den bunun bir sorun olup olmadığını anlayamıyorum. Otomatik kaydetme kullanıyorsanız, geçmişinizin temiz olmasına aldırış etmiyorsunuz sanırım.
Sven Marnach

1
Önlenebiliyorsa taahhüt etmemeyi tercih ederim. Bunu yapmanın bir yolu var mı?
kojiro

3
Bu sorunun cevabı değil
manojlds

7
@manojlds: "Tabii ki OP boş bir kesinleştirme oluşturmak istemiyor." Kristal küremi bugün evde bıraktım, bu yüzden bilmiyordum. cevapsız -polsa, ama yine de
Sven Marnach

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

Bu, kumaşın arızayı görmezden gelmesine neden olur. Boş kaydetme oluşturmama avantajına sahiptir.

with hide('warnings'):Çıktıyı tamamen bastırmak için ek bir katmana sarabilirsiniz , aksi takdirde kumaş çıktısında commit'in başarısız olduğu bir not alırsınız (ancak fabfile çalışmaya devam eder).


3
OP, " Gerçekleştirilecek başarısızlıkları tespit etmek istiyorum" yazdı ; bu kod, işlenecek tüm hataları gizleyecektir .
bfontaine

-2

dene / yakala bebeğim!

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

10
Neden olumsuz oy aldığınızı açıklamak için: Yakalamak isteyeceğiniz başka hatalar olabilir. Sadece bir hata durumunda, hiçbir şeyin yapılmaması gerekebileceğini varsaymak istemezsiniz. - Ayrıca, ama bu ilgisiz: Asla onun yerine jenerik except:kullanmayın, except Exceptionya da benzeri kullanmayın.
Albert
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.