【问题标题】:git: programmatically test if index is dirty [duplicate]git:以编程方式测试索引是否脏[重复]
【发布时间】:2012-02-28 12:26:39
【问题描述】:

我正在编写一个脚本来执行此操作:

#!/bin/bash
mysqldump -u user -p database > db_file
git add db_file
git commit -m 'db_file updated by script'

但是,如果我运行这个脚本时索引脏了怎么办?也就是说,如果我已经git added 文件,我不想在此脚本运行时自动提交,该怎么办?我可以这样做:

#!/bin/bash
mysqldump -u user -p database > db_file
git stash
git add db_file
git commit -m 'db_file updated by script'
git stash apply

但现在的问题是,如果索引和工作树脏了,那么 git stash 不会向存储列表添加任何内容,但 git stash apply 将错误地应用顶部的任何内容存储并丢弃该存储的历史记录。

如何根据索引是否脏来设置 bash 条件?

【问题讨论】:

    标签: git bash


    【解决方案1】:

    git diff --cached --quiet

    上一个答案:

    git diff --cached 将准确显示我想知道的内容。唯一的问题是返回值无论如何都是真的,所以很难以此为条件。如果没有更好的答案,那么我可以将输出转储到文件中,并确定文件是否为空。但这听起来很痛苦。肯定有更好的方法。

    【讨论】:

    • git diff --cached --quiet?
    • --quiet:禁用程序的所有输出。暗示--exit-code。也就是说,如果存在差异,则以 1 退出,而 0 表示没有差异。 Docs
    【解决方案2】:

    你可以解析git status -s的输出。

    if git status -s | grep -q '^.M'
    then
        # ...
    fi
    

    【讨论】:

    • 对于稍后查看此问题的其他人,我认为stackoverflow.com/questions/2657935/… 有一个更强大的解决方案。
    • 这太骇人听闻了。 Git 为这种事情提供了low-level "plumbing" commands,所以你不要做这样的事情。
    • @AndrewMarshall:建设性的评论会推荐一个替代方案。你会建议哪个管道命令?
    • @Greg 有趣的是,“管道式”命令(即能够在脚本中解析)将是...git status -z --porcelain(!),正如我在stackoverflow.com/a/6978402/6309 中提到的那样/跨度>
    • @VonC: ...而且人们说 Git 的命令集不一致。我无法想象为什么!我想知道引入git status --plumbing--porcelain 含义相同(并弃用--porcelain 但不删除它)的补丁是否值得。
    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多