百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

如何获取Git中当前提交的哈希值

wptr33 2025-05-26 19:22 46 浏览

技术背景

在使用Git进行版本控制时,每个提交都有一个唯一的哈希值,它可以用于标识特定的提交,方便回退、对比和引用等操作。了解如何获取当前提交的哈希值是Git使用中的一个基础技能。

实现步骤

使用 git rev-parse

  • 获取完整哈希值:
git rev-parse HEAD
  • 获取短哈希值:
git rev-parse --short HEAD
  • 验证并获取哈希值:
git rev-parse --verify HEAD

使用 git log

  • 获取长哈希值:
git log -1 --format=%H
  • 获取短哈希值:
git log --pretty=format:'%h' -n 1

使用 git show

  • 获取完整哈希值:
git show -s --format=%H
  • 获取短哈希值:
git show -s --format=%h

-s 标志等同于 --no-patch,表示不显示差异输出。

直接读取文件

.git/refs/heads/master 文件包含 master 分支上最新提交的哈希值,可以直接读取:

cat .git/refs/heads/master

但要注意,Git现在支持将一些头引用存储在 pack-ref 文件中,而不是 /refs/heads/ 文件夹中的文件。

使用 git describe

默认情况下,git describe 会给出 <最近的标签>-<额外提交数>-<当前提交的哈希值> 的格式:

git describe --always

存储哈希值到变量

在脚本中,可以将哈希值存储到变量中:

last_commit=$(git rev-parse HEAD);

如果只需要前10个字符:

last_commit=$(git rev-parse --short=10 HEAD);

自定义别名

可以为获取哈希值的命令设置别名,方便使用:

git config --global alias.lastcommit "rev-parse HEAD"

之后可以使用 git lastcommit 来显示最后一次提交的哈希值。

检查状态并获取哈希值

可以结合 git status 检查工作目录是否干净,并在哈希值后添加 -dirty 标记:

test -z "$(git status --porcelain)" \
    && echo "$(git rev-parse --short HEAD)" \
    || echo "$(git rev-parse --short HEAD)-dirty"

核心代码

Bash脚本示例

#!/usr/bin/env bash

RETURN_CODE_SUCCESS=0
RETURN_CODE_ERROR=1

# 检查git状态是干净还是脏
git_get_status() {
    if [ -z "$(git status --porcelain)" ]; then
        echo "clean"
    else
        echo "dirty"
    fi
}

# 获取短提交哈希值,并检查git状态
git_get_short_hash() {
    is_git_repo="$(git rev-parse --is-inside-work-tree)"

    if [ "$is_git_repo" != "true" ]; then
        echo "(not a git repo)"
        return $RETURN_CODE_SUCCESS
    fi

    git_commit_hash="$(git rev-parse --short HEAD)"

    if [ "$(git_get_status)" = "clean" ]; then
        echo "${git_commit_hash}"
    else
        echo "${git_commit_hash}-dirty"
    fi
}

print_status_if_dirty() {
    if [ "$(git_get_status)" = "dirty" ]; then
        echo ""
        echo "WARNING: Your git status is dirty! You have uncommitted changes:"

        echo ""
        echo "=== git status ==="
        git status

        echo ""
        echo "=== git diff ==="
        git diff

        echo ""
    fi
}

main() {
    git_get_short_hash
    print_status_if_dirty
}

if [ "${BASH_SOURCE[0]}" = "$0" ]; then
    __name__="__main__"
else
    __name__="__source__"
fi

if [ "$__name__" = "__main__" ]; then
    main "$@"
fi

Python示例

import git_get_short_hash
import textwrap

# 别名函数以缩短名称
git_get_short_hash = git_get_short_hash.git_get_short_hash3

git_short_hash = git_get_short_hash()
program_info_str = textwrap.dedent(f"""
    My other program details here...
    Program version: {git_short_hash}
""")
print(program_info_str)
mylogfile.write(program_info_str)

最佳实践

  • 对于日常使用,建议使用 git rev-parse HEADgit rev-parse --short HEAD 来获取哈希值,因为它们简洁且高效。
  • 如果需要在脚本中动态获取哈希值并根据状态进行处理,可以使用上述的 git_get_short_hash 函数。
  • 为常用命令设置别名可以提高工作效率,例如 git sha

常见问题

  • 文件读取方法失效:直接读取 .git/refs/heads 文件夹中的文件可能会失败,因为Git现在支持将一些头引用存储在 pack-ref 文件中。
  • 分离头指针模式:在分离头指针模式下,一些基于引用的方法可能会失败,因为 HEAD 不再指向引用,而是直接指向哈希值。
  • 性能问题:如果对性能有较高要求,cat .git/refs/heads/<分支名> 比其他方法要快得多。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...