本文正在参加「金石计划 . 瓜分6万现金大奖」

大家好,我是 shixin。

前段时刻完成了一个中心代码维护的功能,方针在关键代码被修正及时同步给其他人,防止没经过 review 就上线导致问题,提示的效果图如下:

你不知道的 Git 技巧:如何实现核心代码保护

在实现的过程中,用到一些平时运用不多的 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-refHEAD

symbolic-ref 能够读取、修正和删去符号引证。

什么是符号引证呢?它表明一个以 refs 最初的文件(比如 refs/heads/develop),这个文件保存着本地每个分支当时所在 commit。

咱们能够打开 git 项目的 .git 文件夹,在其间的 refs/heads 文件夹中会保存各个分支当时所指向的 commit:

你不知道的 Git 技巧:如何实现核心代码保护

HEAD 指的是 .git/HEAD,便是一个文件,保存着当时指向的符号引证:

你不知道的 Git 技巧:如何实现核心代码保护

因此 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 十分强大,它能够有这些运用场景:

  1. 获取本地和远端的 commit 差异
  2. 获取指定时刻内的提交记录,能够详细到谁、什么时候、修正了哪些
  3. 获取详细某次提交修正的文件

上面咱们运用的参数 @{u}.. 便是表明获取本地和远端的 commit 差异,然后 --oneline 表明不打印详细信息,只打印 short commit id 和 commit message。

假如要获取指定时刻内的提交记录,能够这样:

git log --pretty="%an(%cd) %h - %s" --since="2022-09-01" --no-merges --name-status

指令执行结果:

504318deMacBook-Pro ShixinDemo % git log --pretty="%an(%cd) %h - %s" --since="2022-09-01" --no-merges --name-status
zhangshixin(Fri Dec 16 22:34:49 2022 +0800) 4e4655b - 阻拦跳转
M       app/src/main/java/com/example/heicdemo/MainActivity.kt
zhangshixin(Fri Dec 16 22:34:30 2022 +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 和修正的文件等指令,经过组合这些指令,就能够实现一个中心代码维护功能了!