105 votes

Comment faire un git commit sans erreur ?

J'essaie d'écrire un script de tissu qui fait un git commit Cependant, s'il n'y a rien à commettre, git se termine avec un statut de 1 . Le script de déploiement prend cela comme un échec, et quitte. Je veux détecter réel les échecs à commettre, donc je ne peux pas juste donner au tissu un ignorer général pour les git commit échecs. Comment puis-je permettre que les échecs des empty-commit soient ignorés afin que le déploiement puisse se poursuivre, tout en détectant les erreurs causées par l'échec d'un vrai commit ?

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

198voto

Tobi Points 13586

Détecter cette condition à l'avance en vérifiant le code de sortie de git diff ?

Par exemple (en shell) :

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

EDIT : Corrigé git diff commandement selon le commentaire de Holger.

71 votes

Notez que git diff est une commande "porcelaine" qui ne doit pas être utilisée pour les scripts. Ce que vous voulez le plus souvent est git diff-index --quiet HEAD || git commit -m 'bla' . Voir aussi cette réponse .

1 votes

Pour expliquer davantage, le problème avec git diff --quiet --exit-code --cached est qu'il sera évalué à 1 (false) seulement pour les fichiers modifiés qui n'ont pas été mis à disposition pour la livraison (fichiers non ajoutés). Le commentaire voté est la meilleure solution pour tenir compte des nouveaux fichiers et des suppressions.

2 votes

Le commentaire sur git diff-index --quiet HEAD || git commit -m 'bla' devrait être une réponse à cette question.

71voto

Sven Marnach Points 133943

De la git commit page de manuel :

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

50 votes

Cela créerait en fait un commit.

6 votes

@ThiefMaster : C'est vrai. Je ne peux pas dire à partir de l'OP si c'est un problème ou non. Je suppose que si vous utilisez des commits automatiques, vous ne vous souciez pas de la propreté de votre historique de toute façon.

1 votes

Je préférerais qu'il ne s'engage pas si on peut l'éviter. Existe-t-il un moyen de le faire ?

6voto

Reegan Points 131

Il suffit d'étendre Tobi & Holger de la réponse de l'entreprise avec un if déclaration.

git add -A
if ! git diff-index --quiet HEAD; then
  git commit -m "Message here"
  git push origin main
fi

Expliquons un peu.

  1. git add -A : mettre en scène vos changements

  2. git diff-index --quiet HEAD comparera vos changements échelonnés avec le HEAD.

    --quiet est important car il impliquera --exit-code qui "fait sortir le programme avec les codes 1 s'il y a eu des différences et 0 signifie aucune différence".

Ver -- tranquille .

5voto

Tyler Eaves Points 5758
with settings(warn_only=True):
  run('git commit ...')

Ainsi, le tissu ignore l'échec. A l'avantage de ne pas créer de commits vides.

Vous pouvez l'envelopper dans une couche supplémentaire de with hide('warnings'): pour supprimer totalement la sortie, sinon vous obtiendrez une note dans la sortie de fabric que le commit a échoué (mais le fabfile continue à s'exécuter).

3 votes

Le PO a écrit "Je veux détecter réel failures-to-commit" ; ce code cachera todo les échecs à l'engagement.

0voto

Jan-Philip Gehrcke Points 6259

Lorsque vous passez par un shell, vous pouvez utiliser la fonction ... || true technique qui consiste à déclarer qu'un échec est attendu et ignoré :

git commit -a -m "beautiful commit" || true

Cela empêcherait également un script de l'interpréteur de commandes de sortir lors de l'utilisation de la commande errexit option.

Au lieu de ... || true vous pouvez également utiliser n'importe quelle autre commande qui se termine avec un code de retour de 0, telle que

git commit -a -m "beautiful commit" || echo "ignore commit failure, proceed"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X