如何在没有错误的情况下git commit什么?


91

我正在尝试编写一个执行脚本git commit;但是,如果没有要提交的内容,则git会退出,状态为1。部署脚本将其视为不成功,然后退出。我确实想检测实际要提交的故障,因此我不能仅仅给Fabric全面忽略git commit故障。如何允许忽略空提交故障,以便部署可以继续进行,但仍然可以捕获实际提交失败时导致的错误?

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

Answers:


154

通过检查git diff?的退出代码来预先捕获此条件。

例如(在shell中):

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

编辑:git diff根据霍尔格的评论修正命令。


64
请注意,这git diff是一个“瓷器”命令,不应用于编写脚本。您最可能想要的是git diff-index --quiet HEAD || git commit -m 'bla'。另请参阅此答案
Holger

1
为了进一步说明问题,问题git diff --quiet --exit-code --cached在于它将1仅针对尚未暂存以提交(未添加文件)的已修改文件将其评估为(false)。投票赞成是解决新文件和删除问题的最佳解决方案。
Jorge Bucaran 2014年

2
关于的评论git diff-index --quiet HEAD || git commit -m 'bla'应该是这个问题的答案。
拉基布

1
由于Tobi不在乎根据Holger的评论来固定他的答案,因此我自己编辑了他的答案。
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 2011年

6
@ ThiefMaster:对。我无法从OP得知这是否是问题。我想如果您使用的是自动提交,则无论如何您都不关心自己的历史记录是否干净。
Sven Marnach 2011年

1
如果可以避免,我希望它不要提交。有没有办法做到这一点?
kojiro 2011年

3
这不是问题的答案
manojlds 2011年

7
@manojlds:“当然,OP不想创建一个空的提交。” 我今天把水晶球留在家中,所以我不知道。-p尽管错过了,但是仍然错过了
Sven Marnach

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

这将导致结构忽略故障。具有不创建空提交的优点。

您可以将其包装在的附加层中with hide('warnings'):以完全抑制输出,否则,您将在结构输出中得到一条注释,表明提交失败(但fabfile继续执行)。


3
OP写道:“我确实想检测实际的提交失败”;此代码将隐藏所有要提交的故障。
bfontaine '16

-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左右替代。
艾伯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.