设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

Git使用中的教训:签名提交确保代码完整可信

2014-9-23 10:53| 发布者: joejoe0332| 查看: 7803| 评论: 0|原作者: 几点人, 无若, petert, Sophietyl, f4f, sg90, 请叫我益达张|来自: oschina

摘要: GIT是一款分布式版本控制系统。简而言之,这意味着任何人可以私自拥有一份你的仓库的副本(copy)进行线下工作。他们可能提交版本到自己的仓库,也可以相互之间进行push和pull。中心仓库对分布式版本控制系统来说不是 ...


  结果如下 (你本机的哈希结果可能不同):

$ git log --oneline --graph
*   9307dc5 Merge branch 'diverge'
|\
| * 996cf32 Added additional content to diverged
| * cfe7389 Added content to diverged
* | 3cbc6d2 Added data to master
|/
* f729243 Yet another foo
* afb1e73 Modified bar
* f227c90 Added bar
* 652f9ae Signed off
* 16ddd46 Added feature X
* cf43808 Test commit of foo


  从上图中可以看出,只有两处需要签名: 3cbc6d2, 在master直接创建, 9307dc5---合并提交后生成.  另外两处提交 (996cf32 和 cfe7389) 不需要签名,在合并时就确保了其有效性 (假设提交者是谨慎的).  但怎么忽略这些提交呢?

$ git log --oneline --graph --first-parent
* 9307dc5 Merge branch 'diverge'
* 3cbc6d2 Added data to master
* f729243 Yet another foo
* afb1e73 Modified bar
* f227c90 Added bar
* 652f9ae Signed off
* 16ddd46 Added feature X
* cf43808 Test commit of foo

  上述例子简单的添加了 --first-parent选项, 这样在遇到有合并提交时只会显示最初的提交记录. 重点就是, 这就只剩下master上的提交记录 (或是你需要参照的分支).这些是需要验证的.


现在的验证工作仅仅需要微调原来的脚本即可:

#!/bin/sh## Validate signatures on only direct commits and merge commits for a particular# branch (current branch)### if a ref is provided, append range spec to include all childrenchkafter="${1+$1..}"# note: bash users may instead use $'\t'; the echo statement below is a more# portable option (-e is unsupported with /bin/sh)t=$( echo '\t' )# Check every commit after chkafter (or all commits if chkafter was not# provided) for a trusted signature, listing invalid commits. %G? will output# "G" if the signature is trusted.git log --pretty="format:%H$t%aN$t%s$t%G?" "${chkafter:-HEAD}" --first-parent \
  | grep -v "${t}G$"# grep will exit with a non-zero status if no matches are found, which we# consider a success, so invert it[ $? -gt 0 ]

如果你在刚建好的分支上运行上述脚本, 你会发现分支中不会包含相应的历史提交记录.由于合并提交的自带标记,结果中也不会显示相应的记录(剩下的就是那些未做标记的提交记录).要展示未标记的合并提交, 可以使用以下命令 (忽略 -S选项):

$ git commit --amend[master 9ee66e9] Merge branch 'diverge'$ ./signchk
9ee66e900265d82f5389e403a894e8d06830e463        Mike Gerwitz    Merge branch 'diverge'f72924356896ab95a542c495b796555d016cbddd        Mike Gerwitz    Yet another foo
$ echo $?1

合并提交将被列出来,需要签名验证.  
[如果需要验证签名的有效性,可以参照以下文章 the section on verifying commits within a web of trust.]
 

总结

  • 注意安全性. PC机上的资源库是否安全? 哪些用户可以信赖?

    • 主机并没有想象的那么安全。谨慎使用远端资源库.

  • 用GPG 签名你的提交 可以确保身份认证,从而远离危害.

  • 对于大规模的代码合并,最好验证出合适的规则. 具体地说,可以验证每次提交 , 只对合并功能提供签名, 或者在 一次提交完成后 再签名相应的提交.

  • 如果有现成的资源库, 没必要再重写原有的提交记录.

  • 在确定了你的安全策略后,最好能 自动化签名验证以确保提交的安全性.




酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部