Git笔记(28) 签署工作

  • 1. 签署工作
  • 2. GPG 介绍
  • 3. 签署标签
  • 4. 验证标签
  • 5. 签署提交
  • 6. 使用环境

1. 签署工作

Git 虽然是密码级安全的,但它不是万无一失的
如果从因特网上的其他人那里拿取工作,并且想要验证提交是不是真正地来自于可信来源
Git 提供了几种通过 GPG 来签署和验证工作的方式。


2. GPG 介绍

首先,在开始签名之前需要先配置 GPG 并安装个人密钥

$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub   2048R/0A46826A 2014-06-04
uid                  Jove (Git signing key) <jove@gmail.com>
sub   2048R/874529A9 2014-06-04

如果还没有安装一个密钥,可以使用 gpg --gen-key 生成一个

gpg --gen-key

一旦有一个可以签署的私钥,可以通过设置 Git 的 user.signingkey 选项来签署

git config --global user.signingkey 0A46826A

现在 Git 默认使用你的密钥来签署标签与提交


3. 签署标签

如果已经设置好一个 GPG 私钥,可以使用它来签署新的标签
所有需要做的只是使用 -s 代替 -a 即可:

$ git tag -s v1.5 -m 'my signed 1.5 tag'You need a passphrase to unlock the secret key for
user: "Jove <jove@straub.cc>"
2048-bit RSA key, ID 800430EB, created 2014-05-04

如果在那个标签上运行 git show,会看到你的 GPG 签名附属在后面:

$ git show v1.5
tag v1.5
Tagger: Jove <jove@straub.cc>
Date:   Sat May 3 20:29:41 2014 -0700my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----commit ca82a6dff817ec66f44342007202690a93763949
Author: Jove <jove@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700changed the version number

4. 验证标签

要验证一个签署的标签,可以运行 git tag -v [tag-name]
这个命令使用 GPG 来验证签名
为了验证能正常工作,签署者的公钥需要在你的钥匙链中

$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Jasek <jasek@cox.net> 1158138501 -0700GIT 1.4.2.1Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Jasek <jasek@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

如果没有签署者的公钥,那么你将会得到类似下面的东西:

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

5. 签署提交

如果相对于标签而言,对直接签署到提交更感兴趣的话
所有要做的只是增加一个 -Sgit commit 命令

$ git commit -a -S -m 'signed commit'You need a passphrase to unlock the secret key for
user: "Jove (Git signing key) <jove@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04[master 5c3386c] signed commit4 files changed, 4 insertions(+), 24 deletions(-)rewrite Rakefile (100%)create mode 100644 lib/git.rb

git log 也有一个 --show-signature 选项来查看及验证这些签名

$ git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun  4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Jove (Git signing key) <jove@gmail.com>"
Author: Jove <jove@gmail.com>
Date:   Wed Jun 4 19:49:17 2014 -0700signed commit

另外,也可以配置 git log 来验证任何找到的签名并将它们以 %G? 格式列在输出中

$ git log --pretty="format:%h %G? %aN  %s"5c3386c G Jove  signed commit
ca82a6d N Jove  changed the version number
085bb3b N Jove  removed unnecessary test code
a11bef0 N Jove  first commit

这里可以看到只有最后一次提交是签署并有效的,而之前的提交都不是

git mergegit pull 可以使用 --verify-signatures 选项
来检查并拒绝没有携带可信 GPG 签名的提交
如果使用这个选项来合并一个包含未签名或有效的提交的分支时,合并不会生效

$ git merge --verify-signatures non-verify
fatal: Commit ab06180 does not have a GPG signature.

如果合并包含的只有有效的签名的提交
合并命令会提示所有的签名它已经检查过了然后会继续向前

$ git merge --verify-signatures signed-branch
Commit 13ad65e has a good GPG signature by Jove (Git signing key) <jove@gmail.com>
Updating 5c3386c..13ad65e
Fast-forwardREADME | 2 ++1 file changed, 2 insertions(+)

也可以给 git merge 命令附加 -S 选项来签署自己生成的合并提交
下面的例子演示了验证将要合并的分支的每一个提交都是签名的
并且签署最后生成的合并提交

$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e has a good GPG signature by Jove (Git signing key) <jove@gmail.com>You need a passphrase to unlock the secret key for
user: "Jove (Git signing key) <jove@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04Merge made by the 'recursive' strategy.README | 2 ++1 file changed, 2 insertions(+)

6. 使用环境

如果决定在正常的工作流程中使用它,必须确保团队中的每一个人都理解如何这样做
如果没有,将会花费大量时间帮助其他人找出并用签名的版本重写提交
在采用签署成为标准工作流程的一部分前,确保完全理解 GPG 及签署带来的好处


参考: git
以上内容,均根据git官网介绍删减、添加和修改组成


相关推荐:

Git笔记(27) 储藏与清理
Git笔记(26) 交互式暂存
Git笔记(25) 选择修订版本
Git笔记(24) 维护项目
Git笔记(23) 不同角色的贡献


谢谢

Git笔记(28) 签署工作相关推荐

  1. Git笔记(21) 分布式工作流程

    Git笔记(21) 分布式工作流程 1. 分布式特性 2. 集中式工作流 3. 集成管理者工作流 4. 司令官与副官工作流 1. 分布式特性 同传统的集中式版本控制系统(CVCS)不同 Git 的分布 ...

  2. 7.4 Git 工具 - 签署工作

    签署工作 Git 虽然是密码级安全的,但它不是万无一失的. 如果你从因特网上的其他人那里拿取工作,并且想要验证提交是不是真正地来自于可信来源,Git 提供了几种通过 GPG 来签署和验证工作的方式. ...

  3. Git笔记(33) Rerere

    Git笔记(33) Rerere 1. 重用记录的解决方案 2. 干净的合并和变基 3. 举例 1. 重用记录的解决方案 git rerere 功能是一个隐藏的功能 正如它的名字"重用记录的 ...

  4. Git笔记(32) 高级合并

    Git笔记(32) 高级合并 1. 合并冲突 1.1. 中断一次合并 1.2. 忽略空白 1.3. 手动文件再合并 1.4. 检出冲突 1.5. 合并日志 1.6. 组合式差异格式 2. 撤消合并 2 ...

  5. Git笔记(31) 重置揭密

    Git笔记(31) 重置揭密 1. 三棵树 1.1. HEAD 1.2. 索引 1.3. 工作目录 2. 工作流程 3. 重置 3.1. 移动 HEAD(--soft) 3.2. 更新索引(--mix ...

  6. Git笔记(29) 搜索

    Git笔记(29) 搜索 1. 浏览代码和提交 2. Git Grep 3. Git 日志搜索 4. 行日志搜索 1. 浏览代码和提交 无论仓库里的代码量有多少 经常需要查找一个函数是在哪里调用或者定 ...

  7. 【Git笔记2】必知习惯和如何版本回退

    良好的习惯会让工作和生活如鱼得水,在使用git的时候有些必知习惯和概念你要get一下,总有些许失误,如:已经提交了不合适的修改到版本库时还没有把自己的本地版本库推送到远程,想要撤销本次提交,或者已经p ...

  8. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  9. git 32位_完整的GIT笔记 快速上手小白教程

    GIT 是什么? Git 是目前世界上最先进的分布式版本控制系统.并且它是一个免费的.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 什么是版本控制系统 版本控制是一种系统,它跟踪一 ...

最新文章

  1. mysql yearweek 日期不准_Mysql 中,WEEK 与YEARWEEK函数的参数问题
  2. SQL Server 数据库使用备份还原造成的孤立用户和对象名‘xxx’无效的错误的解决办法...
  3. oracle with check option 的作用
  4. Python基础之函数
  5. IndexedDB基本概念
  6. AndroidStudio_android多线程和异步任务_要学内容介绍_相关知识点---Android原生开发工作笔记241
  7. 学生机房虚拟化之磁盘操作
  8. IP is locked 的解决办法 Vivado
  9. 如何用Latex合并两个pdf
  10. 如何通过Android日历api插入日程(事件)和提醒(通知)
  11. 软考学习:吐血整理——自学软考的终极干货
  12. linux 彻底删除oracle,Linux下完美卸载Oracle
  13. One Pixel Attack(对抗攻击) —— 使用差分进化算法寻找最优解
  14. 计算机协会游园活动方案,计算机爱好者协会建设策划方案
  15. html中实现鼠标悬停放大,如何实现鼠标悬停图片放大的效果。
  16. 如何0基础学stm32?
  17. 视频教程-OmniPlan项目管理就该这样学-研发管理
  18. 读取和讯博客数据可视化分析
  19. 微信小程序的语音输入功能开发:微信同声传译插件
  20. 微信公众号没办法直接获取用户的手机号

热门文章

  1. WARNING: 997: Failure to setup sound, err = -50
  2. Cognos值提示设置小技巧
  3. 人生也要一个中心两个基本点(转载)
  4. spring整合中application.xml配置
  5. C语言的一些知识总结
  6. c语言case标号是连续的吗,在switch语句中,case后的标号只能是什么?_后端开发...
  7. Docker基础(2)——基础操作
  8. Java_Date_01_判断两个时间相差的天数
  9. 为未来元素添加点击事件的两种写法
  10. 避免下载Word/Excel文件时被IE开启