我正在尝试编写一个执行脚本git commit
;但是,如果没有要提交的内容,则git会退出,状态为1
。部署脚本将其视为不成功,然后退出。我确实想检测实际要提交的故障,因此我不能仅仅给Fabric全面忽略git commit
故障。如何允许忽略空提交故障,以便部署可以继续进行,但仍然可以捕获实际提交失败时导致的错误?
def commit():
local("git add -p && git commit")
Answers:
通过检查git diff?的退出代码来预先捕获此条件。
例如(在shell中):
git add -A
git diff-index --quiet HEAD || git commit -m 'bla'
编辑:git diff
根据霍尔格的评论修正命令。
git diff --quiet --exit-code --cached
在于它将1
仅针对尚未暂存以提交(未添加文件)的已修改文件将其评估为(false)。投票赞成是解决新文件和删除问题的最佳解决方案。
git diff-index --quiet HEAD || git commit -m 'bla'
应该是这个问题的答案。
从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.
-p
尽管错过了,但是仍然错过了
with settings(warn_only=True):
run('git commit ...')
这将导致结构忽略故障。具有不创建空提交的优点。
您可以将其包装在的附加层中with hide('warnings'):
以完全抑制输出,否则,您将在结构输出中得到一条注释,表明提交失败(但fabfile继续执行)。
尝试/抓住宝贝!
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))
except:
,使用except Exception
左右替代。
git diff
是一个“瓷器”命令,不应用于编写脚本。您最可能想要的是git diff-index --quiet HEAD || git commit -m 'bla'
。另请参阅此答案。