前段階で核心代コードの保護機能が完了しました。目標は、核心代コードの修正および同時実行であり、レビューの回避を避け、上層での結果问题、提案された効果です。図は次のとおりです。
実装プロセスでは、いくつかの段階で多くの Git テクニックが使用されます。このセクションの続きは次のとおりです。現在交換用の情報
を介して、頻繁に使用される独自の多数の構成情報を保存しています。快捷键、用户信息、项目地址、分支信息等:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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</pre><div class="contentsignin">ログイン後にコピー</div></div><h1 data-id="heading-1">如何获取当前分支</h1><p>为了减少提示频率,最好只检测核心的分支的提交(包括 merge commit)。如何获取当前分支呢?有一个简单的方式:</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">git symbolic-ref --short HEAD</pre><div class="contentsignin">ログイン後にコピー</div></div><p>这句命令主要包括两个关键字:<code>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,因此在拦截 push 时,需要获取到当前要 push 的所有 commit 信息,然后获取每个 commit 修改的文件。
获取要 push 信息可以通过 git log @{u}.. --oneline
:
504318deMacBook-Pro ShixinDemo % git log @{u}.. --oneline 4e4655b (HEAD -> master) 拦截跳转 f947180 修改文件
git log
非常强大,它可以有这些使用场景:
上面我们使用的参数 @{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 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 ヒントを共有してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。