我正在尝试编写一个执行git commit的结构脚本;但是,如果没有要提交的内容,git就会退出,状态为1。deploy脚本会认为这是不成功的,然后退出。我确实想检测 actual failures-to-commit,所以我不能只给予fabric忽略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 bypasses the safety, and
is primarily for use by foreign SCM interface scripts.
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))
6条答案
按热度按时间aor9mmx11#
通过检查
git diff-index
的退出代码来预先捕获此条件?例如(在shell中):
git diff
命令。*nnvyjq4y2#
在
git commit
手册页中:s8vozzvw3#
只是用一个明确的
if
语句扩展了Tobi和Holger的答案。让我们给予它一点解释。
git add -A
:暂存更改(下一步需要)git diff-index --quiet HEAD
将把您的暂存更改与HEAD进行比较。--quiet
是重要的,因为它将暗示--exit-code
,其“如果存在差异,则使程序以代码1退出,而0意味着没有差异”。看安静。
uidvcgyl4#
这会导致Fabric忽略失败。具有不创建空提交的优点。
您可以将其 Package 在
with hide('warnings'):
的附加层中,以完全抑制输出,否则您将在fabric输出中得到一个提示,指出提交失败(但fabfile继续执行)。8mmmxcuj5#
在执行shell时,可以使用
... || true
技术来声明一个预期失败并将其忽略:这也会阻止shell脚本在使用
errexit
选项时退出。除了
... || true
,您还可以使用任何其他退出时返回代码为0的命令,例如c7rzv4ha6#
试试/抓住宝贝!