以编程方式打印 git 修订版并检查未提交的更改

Posted

技术标签:

【中文标题】以编程方式打印 git 修订版并检查未提交的更改【英文标题】:Programmatically printing git revision and checking for uncommitted changes 【发布时间】:2011-02-13 15:05:11 【问题描述】:

为确保我的科学分析可重现,我想以编程方式检查代码库是否有任何未签入的修改,如果没有,则打印出正在使用的提交。

例如,如果有未提交的更改,它应该输出

Warning: uncommitted changes made. This output may not be reproducible.

否则,生产

Current commit: d27ec73cf2f1df89cbccd41494f579e066bad6fe

理想情况下,它应该使用“管道”,而不是“瓷器”。

【问题讨论】:

【参考方案1】:

您需要的 Git 管道是 diff-index, rev-parse --verify 可能还有 rev-parse --show-cdupls-files --others

以下 shell 程序使用这些 Git 管道命令,具有可调整的未跟踪/忽略处理,并且对所有可能的错误情况相当小心。

#!/bin/sh

# warn-unclean: print a warning if the working tree and index are not clean

#  For utmost strictness, set check_untracked=yes and check_ignored=yes.
#  When both are 'yes', verify that working tree and index are identical to HEAD.
#  When only check_untracked is yes, extra ignored files are allowed.
#  When neither is yes, extra untracked files and ignored files are allowed.

check_untracked=yes
check_ignored=yes

warn() 
    echo 'Warning: '"$*" \
        'This output may not be reproducible.'


# Compare HEAD to index and/or working tree versions of tracked files
git diff-index --quiet HEAD
case $? in
    0)
        if test "$check_untracked" != yes; then
            clean=yes
        else
            # Still need to check for untracked files

            or_ignored=''
            exclude=--exclude-standard
            if test "$check_ignored" = yes; then
                or_ignored=' or ignored'
                exclude=''
            fi

            (
                # Move to top level of working tree
                if up="$(git rev-parse --show-cdup)"; then
                    test -n "$up" && cd "$up"
                else
                    echo 'error running "git rev-parse --show-cdup"'
                    exit 129
                fi

                # Check for untracked files
                git ls-files --others $exclude --error-unmatch . >/dev/null 2>&1
                case $? in
                    0)  # some untracked/ignored file is present
                        warn 'some untracked'"$or_ignored"' file is present.'
                        exit 1
                    ;;
                    1)  # no untracked files
                        exit 0
                    ;;
                    *)
                        echo 'error running "git diff-index"!'
                        exit 129
                    ;;
                esac

            )
            case $? in
                0) clean=yes ;;
                1) clean=no ;;
                *) exit $? ;;
            esac
        fi

        test "$clean" = yes &&
        if c="$(git rev-parse --verify HEAD)"; then
            echo 'Current commit: '"$c"
        else
            echo 'error running "git rev-parse --verify"!'
        fi
    ;;
    1)
        warn 'some tracked file has an uncommitted change.'
    ;;
    *)
        echo 'error running "git diff-index"!'
        exit 129
    ;;
esac

如果您希望它的退出代码在所有情况下都有意义,您可以再添加一些 exits。

如果您不关心所有错误处理或未跟踪/忽略的处理,那么简短的内容可能就足够了:

if git diff-index --quiet; then
    printf 'Current commit: %s\n' "$(git rev-parse --verify HEAD)
else
    echo 'Warning: …'
fi

您还可以以简洁的方式检查未跟踪的文件(可以针对忽略等进行调整),无需错误处理:

git ls-files --others --exclude-standard --error-unmatch \
    "./$(git rev-parse --show-cdup)" >/dev/null 2>&1

【讨论】:

【参考方案2】:

这使用瓷器,但git diff --exit-code 如果与现有文件有差异,则以 1 退出,如果与现有文件没有差异,则以 0 退出。不幸的是,它不会检查未跟踪的文件。

This answer to 如何在 Git 中检索当前提交的哈希值?提倡 git rev-parse --verify HEAD 打印当前提交。

【讨论】:

以上是关于以编程方式打印 git 修订版并检查未提交的更改的主要内容,如果未能解决你的问题,请参考以下文章

我是否可以拉出远程Git存储库并获得远程(未提交的)工作更改?

使用 Git 检查脏索引或未跟踪文件

使用未提交的更改从“hg update”中恢复

GitHub的使用(用Git完成代码提交)

GitHub的使用(用Git完成代码提交)

git commit 在一行中打印出消息