分享一个重要的Git技巧,能保护核心代码!
发布时间 - 2022-12-30 00:00:00 点击率:次前段时间完成了一个核心代码保护的功能,目标在关键代码被修改及时同步给其他人,避免没经过 review 就上线导致问题,提示的效果图如下:
在实现的过程中,用到一些平时使用不多的 Git 技巧,这篇文章来总结一下。
如何获取当前提交用户信息
这个比较简单,通过 git config user.name 即可:
04318deMacBook-Pro % git config user.name zhangshixin
git config 保存了很多配置信息,其中常用的有自定义快捷键、用户信息、项目地址、分支信息等:
504318deMacBook-Pro % git config -l //快捷键 begin >>> 我们可以定义自己的 git 快捷键 alias.st=status alias.co=checkout alias.cb=checkout alias.p=pull alias.pr=pull alias.pu=push alias.cm=commit alias.br=branch alias.cm=commit alias.undo=reset alias.rbc=rebase alias.save=stash alias.pop=stash //快捷键 end <<< 我们可以定义自己的 git 快捷键 //用户名称和邮箱 begin >>> user.name=zhangshixin user.email=shixin.zhang@xxx.com //用户名称和邮箱 end <<< //项目和分支信息 begin >>> remote.origin.url=git@gitlab.xxx:android/xxx.git remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* branch.master.remote=origin branch.master.merge=refs/heads/master branch.Canary.remote=origin branch.Canary.merge=refs/heads/Canary //项目和分支信息 end <<< pull.rebase=true //默认 pull 是 merge 还是 rebase
如何获取当前分支
为了减少提示频率,最好只检测核心的分支的提交(包括 merge commit)。如何获取当前分支呢?有一个简单的方式:
git symbolic-ref --short HEAD
这句命令主要包括两个关键字:symbolic-ref 和 HEAD。
symbolic-ref 可以读取、修改和删除符号引用。
什么是符号引用呢?它表示一个以 refs 开头的文件(比如 refs/heads/develop),这个文件保存着本地每个分支当前所处 commit。
我们可以打开 git 项目的 .git 文件夹,在其中的 refs/heads 文件夹中会保存各个分支当前所指向的 commit:
HEAD 指的是 .git/HEAD,就是一个文件,保存着当前指向的符号引用:
因此 git symbolic-ref --short HEAD 的含义就是读取 .git/HEAD 文件的内容,我这里就是 refs/heads/develop 文件,因此就得出当前分支是 develop 分支。
如何获取本地未 push 的所有 commit
有时候我们会在本地提交多次后再 push,因此在拦截 push 时,需要获取到当前要 push 的所有 commit 信息,然后获取每个 commit 修改的文件。
获取要 push 信息可以通过 git log @{u}.. --oneline:
504318deMacBook-Pro ShixinDemo % git log @{u}.. --oneline
4e4655b (HEAD -> master) 拦截跳转
f947180 修改文件git log 非常强大,它可以有这些使用场景:
- 获取本地和远端的 commit 差异
- 获取指定时间内的提交记录,可以具体到谁、什么时候、修改了哪些
- 获取具体某次提交修改的文件
上面我们使用的参数 @{u}.. 就是表示获取本地和远端的 commit 差异,然后 --oneline 表示不打印具体信息,只打印 short commit id 和 commit message。
如果要获取指定时间内的提交记录,可以这样:
git log --pretty="%an(%cd) %h - %s" --since="2025-09-01" --no-merges --name-status
命令执行结果:
504318deMacBook-Pro ShixinDemo % git log --pretty="%an(%cd) %h - %s" --since="2025-09-01" --no-merges --name-status zhangshixin(Fri Dec 16 22:34:49 2025 +0800) 4e4655b - 拦截跳转 M app/src/main/java/com/example/heicdemo/MainActivity.kt zhangshixin(Fri Dec 16 22:34:30 2025 +0800) f947180 - 修改文件 M .idea/gradle.xml M .idea/misc.xml D .idea/runConfigurations.xml A android10_dem_heic_output.heic A app/src/main/assets/android10_dem_heic_output.heic R100 app/src/main/res/drawable/mushroom.jpg app/src/main/assets/mushroom.jpg A app/src/main/assets/mushroom.webp M app/src/main/java/com/example/heicdemo/MainActivity.kt A app/src/main/res/drawable/mushroom.webp M app/src/main/res/layout/activity_main.xml
pretty 的参数用于指定打印的内容和格式;since 参数用于指定查看时间范围;no-merges 表示过滤掉 merge 时生成的额外 commit;name-status 表示展示出文件的修改状态(M 表示修改;D 表示删除;A 表示增加;R 表示重命名)。
如何获取每个 commit 修改的文件
知道 commit ID 后,可以通过 git show --pretty="" --name-only $commitId 获取这个 commit 影响的信息:
04318deMacBook-Pro ShixinDemo % git show --pretty="" --name-only 4e4655b app/src/main/java/com/example/shixindemo/MainActivity.kt
git show 可以用来查看 commit 的 commit message 和修改的文件、文件具体内容等信息。上面的代码中我们使用了 name-only 参数表示只要查看修改的文件即可。
总结
这篇文章介绍了通过拦截 git push 时,获取当前用户、当前分支、未 push 的 commit 和修改的文件等命令,通过组合这些命令,就可以实现一个核心代码保护功能了!
# git
# auto
# break
# display
# position
# overflow
# margin
# padding
# border
# background
# transform
# ul
# table
# td
# tr
# th
# li
# microsoft
# ui
# word
# 我们可以
# 自己的
# 时间内
# 可以通过
# 跳转
# 这篇文章
# 远端
# 什么时候
# 不多
# 会在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
如何在腾讯云服务器上快速搭建个人网站?
创业网站制作流程,创业网站可靠吗?
三星、SK海力士获美批准:可向中国出口芯片制造设备
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
EditPlus中的正则表达式 实战(4)
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
清除minerd进程的简单方法
node.js报错:Cannot find module 'ejs'的解决办法
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何用已有域名快速搭建网站?
非常酷的网站设计制作软件,酷培ai教育官方网站?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Laravel如何处理异常和错误?(Handler示例)
Laravel如何实现文件上传和存储?(本地与S3配置)
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
php结合redis实现高并发下的抢购、秒杀功能的实例
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何使用Service Container和依赖注入?(代码示例)
详解Oracle修改字段类型方法总结
JS实现鼠标移上去显示图片或微信二维码
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel如何实现多对多模型关联?(Eloquent教程)
MySQL查询结果复制到新表的方法(更新、插入)
微信小程序 canvas开发实例及注意事项
大型企业网站制作流程,做网站需要注册公司吗?
,南京靠谱的征婚网站?
javascript中闭包概念与用法深入理解
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
JavaScript如何实现倒计时_时间函数如何精确控制
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
如何在IIS服务器上快速部署高效网站?
如何解决hover在ie6中的兼容性问题
C++时间戳转换成日期时间的步骤和示例代码
如何续费美橙建站之星域名及服务?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel中的withCount方法怎么高效统计关联模型数量
LinuxCD持续部署教程_自动发布与回滚机制


/main/assets/mushroom.jpg
A app/src/main/assets/mushroom.webp
M app/src/main/java/com/example/heicdemo/MainActivity.kt
A app/src/main/res/drawable/mushroom.webp
M app/src/main/res/layout/activity_main.xml