为了账号安全,请及时绑定邮箱和手机立即绑定

如何以编程方式确定是否存在未提交的更改?

如何以编程方式确定是否存在未提交的更改?

Git
慕雪6442864 2019-12-12 14:12:15
在Makefile中,如果有未提交的更改(在工作树或索引中),我想执行某些操作。最干净,最有效的方法是什么?在一种情况下以零返回值而在另一种情况下以零返回值的退出命令将适合我的目的。我可以运行git status输出并将其通过管道传输grep,但是我觉得必须有更好的方法。
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

在OP 丹尼尔Stutzbach指出,在评论这个简单的命令git diff-index为他工作:


git diff-index --quiet HEAD --

如果在bash脚本中使用命令,则可以看到“ 如何检查命令是否成功? ”:


git diff-index --quiet HEAD -- || echo "untracked"; // do something about it

注:如评论由安东尼Sottile


git diff-index HEAD ...将在没有提交的分支(例如新初始化的存储库)上失败。

我发现的一种解决方法是git diff-index $(git write-tree) ...


并haridsv指出在评论即git diff-files上一个新的文件,不检测它作为一个差异。

较安全的方法似乎是先git add在文件规格上运行,然后再git diff-index查看运行前是否将任何内容添加到索引中git commit。


git add ${file_args} && \

git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'

而6502在评论中报告:


我碰到的一个问题是,这git diff-index将告诉我们,除了文件的时间戳记以外,实际上什么也没有。

运行git diff一次即可解决问题(令人惊讶的是,git diff实际上确实更改了沙箱的内容,这意味着.git/index)


如果git 在docker中运行,也会出现这些时间戳问题。


原始答案:


“以编程方式”意味着从不依赖瓷器命令。

始终依靠管道命令。


另请参见“ 使用Git检查脏索引或未跟踪的文件 ”以了解替代方法(如git status --porcelain)


您可以从撰写本文时所写的新“ require_clean_work_tree函数 ”中获得启发;)(2010年10月上旬)


require_clean_work_tree () {

    # Update the index

    git update-index -q --ignore-submodules --refresh

    err=0


    # Disallow unstaged changes in the working tree

    if ! git diff-files --quiet --ignore-submodules --

    then

        echo >&2 "cannot $1: you have unstaged changes."

        git diff-files --name-status -r --ignore-submodules -- >&2

        err=1

    fi


    # Disallow uncommitted changes in the index

    if ! git diff-index --cached --quiet HEAD --ignore-submodules --

    then

        echo >&2 "cannot $1: your index contains uncommitted changes."

        git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2

        err=1

    fi


    if [ $err = 1 ]

    then

        echo >&2 "Please commit or stash them."

        exit 1

    fi

}


查看完整回答
反对 回复 2019-12-12
?
GCT1015

TA贡献1827条经验 获得超4个赞

虽然其他解决方案非常彻底,但是如果您想要快速又脏的东西,请尝试以下操作:


[[ -z $(git status -s) ]]

它只是检查状态摘要中是否有任何输出。


查看完整回答
反对 回复 2019-12-12
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

git diff --exit-code如有任何更改,将返回非零值;git diff --quiet一样,没有输出。由于您要检查工作树和索引,因此请使用


git diff --quiet && git diff --cached --quiet

要么


git diff --quiet HEAD

任何人都会告诉您是否存在未提交的更改。


查看完整回答
反对 回复 2019-12-12
  • 2 回答
  • 0 关注
  • 587 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信