如何获取Git中当前提交的哈希值
wptr33 2025-05-26 19:22 14 浏览
技术背景
在使用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 HEAD 或 git rev-parse --short HEAD 来获取哈希值,因为它们简洁且高效。
- 如果需要在脚本中动态获取哈希值并根据状态进行处理,可以使用上述的 git_get_short_hash 函数。
- 为常用命令设置别名可以提高工作效率,例如 git sha。
常见问题
- 文件读取方法失效:直接读取 .git/refs/heads 文件夹中的文件可能会失败,因为Git现在支持将一些头引用存储在 pack-ref 文件中。
- 分离头指针模式:在分离头指针模式下,一些基于引用的方法可能会失败,因为 HEAD 不再指向引用,而是直接指向哈希值。
- 性能问题:如果对性能有较高要求,cat .git/refs/heads/<分支名> 比其他方法要快得多。
- 上一篇:日常开发中常用的git操作命令和使用技巧
- 下一篇:手把手带你入门github
相关推荐
- Python自动化脚本应用与示例(python办公自动化脚本)
-
Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...
- Python文件操作常用库高级应用教程
-
本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...
- Python办公自动化系列篇之六:文件系统与操作系统任务
-
作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...
- 14《Python 办公自动化教程》os 模块操作文件与文件夹
-
在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...
- python中os模块详解(python os.path模块)
-
os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...
- 21-Python-文件操作(python文件的操作步骤)
-
在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...
- 轻松玩转Python文件操作:移动、删除
-
哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...
- Python 初学者练习:删除文件和文件夹
-
在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...
- 引人遐想,用 Python 获取你想要的“某个人”摄像头照片
-
仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...
- Python如何使用临时文件和目录(python目录下文件)
-
在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...
- Linux 下海量文件删除方法效率对比,最慢的竟然是 rm
-
Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...
- Python 开发工程师必会的 5 个系统命令操作库
-
当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...
- Python常用文件操作库使用详解(python文件操作选项)
-
Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...
- 11. 文件与IO操作(文件io和网络io)
-
本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...
- Python os模块的20个应用实例(python中 import os模块用法)
-
在Python中,...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)