Як git нічого не фіксує без помилки?


91

Я намагаюся написати сценарій тканини, який робить a git commit; однак, якщо немає чого робити, git виходить зі статусом 1. Сценарій розгортання сприймає це як невдалий і завершує роботу. Я дійсно хочу виявити фактичні помилки до фіксації, тому я не можу просто давати тканині загальний ігнорування git commitвідмов. Як я можу дозволити ігнорувати помилки порожнього коміту, щоб розгортання могло продовжуватися, але все одно ловити помилки, що виникають, коли справжній коміт не вдається?

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

Відповіді:


154

Вловити цю умову заздалегідь, перевіривши код виходу git diff?

Наприклад (у оболонці):

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

EDIT: Виправлена git diffкоманда згідно з коментарем Холгера.


64
Зауважте, що git diffце "порцелянова" команда, яку не слід використовувати для створення сценаріїв. Що ви, швидше за все, хочетеgit diff-index --quiet HEAD || git commit -m 'bla' . Дивіться також цю відповідь .
Holger

1
Щоб пояснити речі далі, проблема git diff --quiet --exit-code --cachedполягає в тому, що він буде оцінюватися як 1(false) лише для модифікованих файлів, які не були індексовані для коміту (недодані файли). Коментар, за який проголосували, є найкращим рішенням для обліку нових файлів та видалень.
Хорхе Букаран

2
Коментар щодо git diff-index --quiet HEAD || git commit -m 'bla'повинен бути відповіддю на це питання.
Ракіб,

1
Оскільки Тобі було байдуже виправити свою відповідь відповідно до коментаря Холгера, я сам відредагував його відповідь.
vog

Зауважте, що git diff-index --quiet HEAD не перевіряє, чи актуальне місцеве сховище з початком.
bortzmeyer

62

Зі git commitсторінки користувача:

--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
Це насправді створило б коміт.
ThiefMaster

6
@ThiefMaster: Так. Я не можу сказати з ОП, чи є це проблемою чи ні. Думаю, якщо ви використовуєте автоматичні коміти, вам все одно буде важливо, щоб ваша історія була чистою.
Sven Marnach

1
Я волів би, щоб це не робило, якщо цього можна уникнути. Чи є спосіб зробити це?
Коджіро

3
Це не відповідь на запитання
manojlds

7
@manojlds: "Звичайно, OP не хоче створювати порожній коміт." Сьогодні я залишив свою кришталеву кулю вдома, тож не знав. -pхоч і пропустив , але все-таки
Свен Марнах

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

Це змушує тканину ігнорувати несправність. Має ту перевагу, що не створює порожніх комітів.

Ви можете обернути його додатковим шаром, with hide('warnings'):щоб повністю придушити вихідні дані, інакше у вихідних даних тканини ви побачите повідомлення про те, що коміт не вдався (але файл fab продовжує виконуватися).


3
OP написав: "Я дійсно хочу виявити фактичні помилки до фіксації"; цей код приховає всі помилки до комітування.
bfontaine

-2

спробуй / злови дитину!

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
Пояснити, чому вас голосують проти: Можуть бути й інші помилки, які ви хочете вловити. Ви не хочете просто припустити, що у випадку помилки, можливо, нічого не повинно бути вчинено. - Також, але це не пов’язано: ніколи не використовуйте замість цього загальний except:, вживайте except Exceptionабо близько того.
Альберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.