Wie kann man nichts ohne Fehler festschreiben?

91

Ich versuche, ein Fabric-Skript zu schreiben, das a git commit; Wenn jedoch nichts festgeschrieben werden muss, wird git mit dem Status "beendet" 1. Das Bereitstellungsskript nimmt dies als nicht erfolgreich an und wird beendet. Ich möchte tatsächliche Fehler beim Festschreiben erkennen, daher kann ich Fabric nicht einfach eine pauschale Ignorierung für git commitFehler geben. Wie kann ich zulassen, dass Fehler beim leeren Festschreiben ignoriert werden, damit die Bereitstellung fortgesetzt werden kann, aber dennoch Fehler abfangen, die verursacht werden, wenn ein echtes Festschreiben fehlschlägt?

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

Antworten:

154

Fangen Sie diesen Zustand vorher ab, indem Sie den Exit-Code von git diff?

Zum Beispiel (in der Shell):

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

BEARBEITEN: git diffBefehl gemäß Holgers Kommentar korrigiert.

Tobi
quelle
64
Beachten Sie, dass dies git diffein "Porzellan" -Befehl ist, der nicht für die Skripterstellung verwendet werden sollte. Was Sie höchstwahrscheinlich wollen, ist git diff-index --quiet HEAD || git commit -m 'bla'. Siehe auch diese Antwort .
Holger
1
Um die Dinge weiter zu erklären, besteht das Problem git diff --quiet --exit-code --cacheddarin, dass es 1nur für geänderte Dateien (false) ausgewertet wird , die nicht für das Festschreiben bereitgestellt wurden (nicht hinzugefügte Dateien). Der hochgestimmte Kommentar ist die beste Lösung, um neue Dateien und Löschungen zu berücksichtigen.
Jorge Bucaran
2
Der Kommentar zu git diff-index --quiet HEAD || git commit -m 'bla'sollte eine Antwort auf diese Frage sein.
Rakib
1
Da es Tobi nicht wichtig war, seine Antwort gemäß Holgers Kommentar zu korrigieren, habe ich seine Antwort selbst bearbeitet.
Vog
Beachten Sie, dass git diff-index --quiet HEAD nicht testet, ob das lokale Repository mit dem Ursprung auf dem neuesten Stand ist.
Bortzmeyer
62

Von der git commitManpage:

--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
quelle
41
Dies würde jedoch tatsächlich ein Commit erzeugen.
ThiefMaster
6
@ThiefMaster: Richtig. Ich kann vom OP nicht sagen, ob dies ein Problem ist oder nicht. Ich denke, wenn Sie automatische Commits verwenden, ist es Ihnen sowieso egal, ob Ihre Historie sauber ist.
Sven Marnach
1
Ich würde es vorziehen, nicht zu begehen, wenn es vermieden werden kann. Gibt es eine Möglichkeit, das zu tun?
Kojiro
3
Dies ist keine Antwort auf die Frage
Manojlds
7
@manojlds: "Natürlich möchte das OP kein leeres Commit erstellen." Ich habe meine Kristallkugel heute zu Hause gelassen, also wusste ich es nicht. verpasste -pzwar, aber immer noch
Sven Marnach
5
with settings(warn_only=True):
  run('git commit ...')

Dies führt dazu, dass Fabric den Fehler ignoriert. Hat den Vorteil, dass keine leeren Commits erstellt werden.

Sie können es in eine zusätzliche Ebene with hide('warnings'):einschließen, um die Ausgabe vollständig zu unterdrücken. Andernfalls wird in der Fabric-Ausgabe eine Notiz angezeigt, dass das Festschreiben fehlgeschlagen ist (die Fabfile wird jedoch weiterhin ausgeführt).

Tyler Eaves
quelle
3
OP schrieb: "Ich möchte tatsächliche Fehler beim Festschreiben erkennen." Dieser Code verbirgt alle Fehler beim Festschreiben.
Bfontaine
-2

versuche / fang Baby!

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
quelle
10
Um zu erklären, warum Sie herabgestimmt werden: Es kann andere Fehler geben, die Sie abfangen möchten. Sie möchten nicht einfach davon ausgehen, dass im Fehlerfall möglicherweise nichts festgeschrieben werden muss. - Auch, aber das hat nichts damit zu tun : Verwenden Sie stattdessen niemals ein Generikum except:, except Exceptionoder so.
Albert