Bagaimana cara git tidak melakukan apa pun tanpa kesalahan?

91

Saya mencoba untuk menulis skrip kain yang melakukan git commit; namun, jika tidak ada yang perlu dilakukan, git keluar dengan status 1. Skrip penerapan menganggapnya tidak berhasil, dan berhenti. Saya ingin mendeteksi sebenarnya kegagalan-to-komit, jadi saya tidak bisa hanya memberikan kain selimut mengabaikan untuk git commitkegagalan. Bagaimana cara mengizinkan kegagalan komit kosong untuk diabaikan sehingga penerapan dapat dilanjutkan, tetapi masih menemukan kesalahan yang disebabkan ketika komit yang sebenarnya gagal?

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

Jawaban:

154

Ketahui kondisi ini sebelumnya dengan memeriksa kode keluar dari git diff?

Misalnya (di shell):

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

EDIT: git diffPerintah tetap menurut komentar Holger.

Tobi
sumber
64
Perhatikan bahwa git diffini adalah perintah "porselen" yang tidak boleh digunakan untuk pembuatan skrip. Yang paling Anda inginkan adalah git diff-index --quiet HEAD || git commit -m 'bla'. Lihat juga jawaban ini .
Holger
1
Untuk menjelaskan lebih lanjut, masalahnya git diff --quiet --exit-code --cachedadalah bahwa ia akan mengevaluasi ke 1(false) hanya untuk file yang dimodifikasi yang belum dipentaskan untuk komit (file yang tidak ditambahkan). Komentar yang dipilih secara maksimal adalah solusi terbaik untuk memperhitungkan file baru dan penghapusan.
Jorge Bucaran
2
Komentar tentang git diff-index --quiet HEAD || git commit -m 'bla'harus menjadi jawaban dalam pertanyaan ini.
Rakib
1
Karena Tobi tidak peduli untuk memperbaiki jawabannya menurut komentar Holger, saya mengedit jawabannya sendiri.
vog
Perhatikan bahwa git diff-index --quiet HEAD tidak menguji apakah repositori lokal sudah diperbarui dengan aslinya.
bortzmeyer
62

Dari git commithalaman manual:

--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.
Sven Marnach
sumber
41
Ini sebenarnya akan membuat komit.
ThiefMaster
6
@ Pencuri: Benar. Saya tidak tahu dari OP apakah ini masalah atau tidak. Saya kira jika Anda menggunakan komit otomatis, Anda tidak peduli riwayat Anda bersih.
Sven Marnach
1
Saya lebih suka tidak berkomitmen jika itu bisa dihindari. Apakah ada cara untuk melakukannya?
kojiro
3
Ini bukan jawaban untuk pertanyaan
manojlds
7
@manojlds: "Tentu saja OP tidak ingin membuat komit kosong." Saya meninggalkan bola kristal saya di rumah hari ini, jadi saya tidak tahu. merindukan -p, meskipun, tapi tetap
Sven Marnach
5
with settings(warn_only=True):
  run('git commit ...')

Ini menyebabkan fabric mengabaikan kegagalan. Memiliki keuntungan karena tidak membuat komit kosong.

Anda dapat membungkusnya dalam lapisan tambahan with hide('warnings'):untuk menekan keluaran sepenuhnya, jika tidak, Anda akan mendapatkan catatan di keluaran fabric bahwa komit gagal (tetapi fabfile terus dijalankan).

Tyler Eaves
sumber
3
OP menulis "Saya ingin mendeteksi sebenarnya kegagalan-to-komit"; kode ini akan menyembunyikan semua kegagalan-untuk-komit.
bfontaine
-2

coba / tangkap bayi!

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))
devpascoe
sumber
10
Untuk menjelaskan mengapa Anda mendapat suara negatif: Mungkin ada kesalahan lain yang ingin Anda tangkap. Anda tidak ingin hanya berasumsi bahwa jika terjadi kesalahan, mungkin tidak ada yang perlu dilakukan. - Juga, tapi itu tidak terkait: Jangan pernah menggunakan yang generik except:, gunakan except Exceptionatau lebih sebagai gantinya.
Albert