如何在没有错误的情况下git提交任何内容?

koj*_*iro 73 python git fabric

我正在尝试编写一个可以执行的结构脚本git commit; 但是,如果没有提交,git退出状态为1.部署脚本将其视为不成功,并退出.我确实想要检测实际的失败提交,所以我不能仅仅给织物一个忽略git commit失败的问题.如何允许忽略空提交失败,以便部署可以继续,但仍然捕获真正提交失败时导致的错误?

def commit():
    local("git add -p && git commit")
Run Code Online (Sandbox Code Playgroud)

Tob*_*obi 120

通过检查git diff的退出代码事先赶上这个条件?

例如(在shell中):

git add -A
git diff-index --quiet HEAD || git commit -m 'bla'
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`git diff`是一个不应该用于编写脚本的"瓷器"命令.你最想要的是`git diff-index --quiet HEAD || git commit -m'bla'`.另请参阅[此答案](http://stackoverflow.com/a/2659808/659002). (56认同)
  • 在我看来,“git diff-index --quiet --cached HEAD”是正确的答案。如果仅索引和工作树之间存在差异,当前答案“git diff-index --quiet HEAD”(无“--cached”)将不会产生正确的结果,在这种情况下“git commit”将失败。 (4认同)
  • 有人可以解释“git diff-index --quiet HEAD”到底返回什么吗?因为在我的系统上,当有文件暂存供提交和没有文件暂存供提交时,它都会返回“$?=1”。 (3认同)
  • 关于 `git diff-index --quiet HEAD || 的评论 git commit -m 'bla'` 应该是这个问题的答案。 (2认同)
  • 由于托比不想根据霍尔格的评论修改他的答案,所以我自己编辑了他的答案。 (2认同)

Sve*_*ach 55

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.
Run Code Online (Sandbox Code Playgroud)

  • 这实际上会创建一个提交. (35认同)
  • @ThiefMaster:对.我不能告诉OP这是否是一个问题.我想如果你使用的是自动提交,你无论如何都不关心你的历史. (5认同)
  • @manojlds:这怎么不是问题的答案? (5认同)
  • @manojlds:"当然OP不想创建一个空提交." 我今天把水晶球留在了家里,所以我不知道.虽然错过了`-p`,但仍然如此 (5认同)
  • 这不是问题的答案 (3认同)
  • 如果可以避免的话,我宁愿不要承诺。有没有办法做到这一点? (2认同)

Nin*_*ham 20

只是用明确的声明扩展了Tobi & Holger的答案if

git add -A
if ! git diff-index --quiet HEAD; then
  git commit -m "Message here"
  git push origin main
fi
Run Code Online (Sandbox Code Playgroud)

让我们稍微解释一下。

  1. git add -A:暂存您的更改(下一步需要)

  2. git diff-index --quiet HEAD会将您的分阶段更改与 HEAD 进行比较。

    --quiet很重要,因为它意味着--exit-code“如果存在差异,则程序以代码 1 退出,而 0 表示没有差异”。

请参阅--安静


Tyl*_*ves 5

with settings(warn_only=True):
  run('git commit ...')
Run Code Online (Sandbox Code Playgroud)

这会导致结构忽略失败.具有不创建空提交的优点.

您可以将其包装在一个额外的层中with hide('warnings'):以完全抑制输出,否则您将在结构输出中获得提交失败的注释(但fabfile继续执行).

  • OP写道:"我确实希望检测*实际*失败​​ - 提交"; 此代码将隐藏*all*failure-to-commit. (3认同)