##.markdown-body{顏色:#595959;字體大小:15px;字體系列:-apple-system,system-ui,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Hiragino Sans GB,微軟雅黑,Arial,sans-serif;背景影像:線性漸變(90deg,rgba(60,10,30,.04) 3%,透明0),線性漸變(1turn,rgba(60,10,30) ,.04) 3%,透明0);背景大小:20px 20px;背景位置:50%}.markdown-body p{顏色:#595959;字體大小:15px;行高:2;字體-重量:400}.markdown-body p p{margin-top:16px}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{padding:30px 0;margin :0;color:#135ce0}.markdown-body h1{position:relative;text-align:center;font-size:22px;margin:50px 0}.markdown-body h1:之前{位置:絕對;內容:“ 」;頂部:-10px;左側:50%;寬度:32px;高度:32px;變換:translateX(-50%);背景大小:100% 100%;不透明度:.36 ;背景重複:無重複;背景:url(數據:圖像/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABfVBMVEX///8Ad/8AgP8AgP8AgP8 Aff8AgP8Af/8AgP8AVf8Af/8Af/8AgP8AgP8Af/8Afv8AAP8Afv8Afv8Aef8AgP8AdP8Afv8AgP8AgP8Acf8Ae/8AgP8Af/8AgP8Af/8Af/8AfP8Afv8AgP8Af/8Af/8Afv8Afv8AgP8Af v8AgP8Af /8Af/8AgP8AgP8Afv8AgP8Af/8AgP8AgP8AgP8Ae/ 8Afv8Af/8AgP8Af/8AgP8Af/8Af/8Aff8Af/8Abf8AgP8Af/8AgP8Af/8Af/8Afv8AgP8AgP8Afv8Afv8AgP8Af/8Aff8 AgP8Afv8AgP8AgP8AgP8Afv8AgP8AgP8AgP8AgP8AgP8Af/8AgP8Af/8Af/8Aev8Af/8AgP8Aff8Afv8AgP8AgP8AgP8Af/8AgP8AgP8Af/8A8 /8Af ////// rzEHnAAAAfXRSTlMAD7CCAivatxIDx5EMrP19AXdLEwgLR 6iCR/M0yLRzyFF7JupSXn8cw6v60Q0QeqzKtgeG237HMne850/6Qeq7QaZOM /2kASNZpX1Wlf03C4stRGxgUPclqoAAAABYktHRACIBR1IAAAACXBIWXMAAAsTAAALEweampwYAAAAB3RJTUUH4gEaBzgZ4yeM3AAAAT9JREFUOMvNUldbwkkAQvCA v4dOFOW2UjPzgFyLfo6nweKfIMOBYWwFtmMPGz2Yj2pJI0JDq3udJW6VVbmKa9I192VQFV1ktXUAl5NB0cd4KpnORqsEO2ZIRpF9gJfE9DckqAwCACCCACCACA2pA20Ft/ApJA/TJA/AKJ3 月/p.A/ApJA/AKJA/AKJYm/TjakA/Aakm)MYakAKJKJMYYMakAKJKJSYm/StqA1A?Ap KA8NOdjMySgcZGVM6jwcgRuUISs0nlPFNSrEpJfU0jTLD6llqbvKxei7OzvkFNQohi0vAsj81 MoqsCaoPOQFgus/1LyxichW hS2JWCHZ71 DDI9HB07O8ci vRBdvdGnfP4gBuM8vw7X/G3wDmFhFZEdxzjMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTgtMDETMjZUMDc6NTY6MjurMDE6MDA67pVWAVOMJWJA7p7pDPDApDPJ7pV zAxOjAwS7Mt6gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAAWDEVYdFRpdGxlAGp1ZWppbl9sb2dvIGNvcHlxaKAAAAV3pdGxlAGp1ZWppbl9sb2dvIGNvcHlxaKAAAAV3pUW4 AMjCy5jCxMjE0utFAMTIESANMNkAyOzVCDL2NTIxMzEHMQHy4BIoEouAOoXEXTyQjWVAAAAAElFTkSuQmCC)}.markdown-body h2{位置:相對;字體大小:20px;左邊框:4px實體;填充:0 0 0 10px;邊距:30px 0}.markdown-body h3{字體大小:16px}.markdown-body ul{列表-style:disc Outside;margin-left:2em;margin-top:1em}.markdown-body li{line-height:2;color:#595959}.markdown-body img.loaded{margin:0 auto;顯示:區塊}.markdown -body blockquote{背景:#fff9f9;margin:2em 0;padding:2px 20px;border-left:4pxsolid #b2aec5}.markdown-body blockquote p{color:#666;line-height:2} .markdown-body a {顏色:#036aca;border-bottom:1px 實心rgba(3,106,202,.8);font-weight:400;text-decoration:none}.markdown-body em 強,.markdown-body 強{顏色:#036aca}.markdown-body em 強,.markdown-body 強{顏色:#036aca} .markdown-body hr{border-top:1pxsolid #135ce0}.markdown-body pre{overflow:auto}.markdown-body程式碼,.markdown-body pre{overflow:auto;position:relative; line-height:1.75; font-family:Menlo,Monaco,Consolas,Courier New,monospace}.markdown-body pre>code{font-size:12px;padding:15px 12px;margin:0;word-break:normal;顯示:區塊;溢位- x:自動;顏色:#333;背景:#f8f8f8}.markdown-body程式碼{word-break:break-word;邊框半徑:2px;溢出-x:自動;背景顏色: #fff5f5;顏色:#ff502c;字體大小:.87em;填充:.065em .4em}.markdown-body 表{border-collapse:collapse;margin:1rem 0;overflow-x:auto}.markdown-body 表td,.markdown-body 表格th{ border:1px 實心#dfe2e5;padding:.6em 1em}.markdown-body 表格tr{border-top:1px 實心#dfe2e5}.markdown-body 表格tr:nth-child(2n ){background-color:#f6f8fa} 前間隔完成了一個核心程式碼保護的功能,目標在關鍵程式碼被修改及時同步給其他人,沒避免經過審核就上線導致問題,提示的效果圖如下:
在實作的過程中,用到了一些平常很少使用的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="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 和修改的文件等命令,通过组合这些命令,就可以实现一个核心代码保护功能了!