在没有 gpg 签名的情况下验证 git 提交

2024-02-25

我们开始使用 git 作为 VCS,之前使用 SVN,并发现在 git 中您可以轻松区分更改和提交背后的真实人物。现在我们想知道为什么做出这样的设计选择以及是否有我们忽略的事情。

让我们假设以下情况:

  1. 每个人都已经向 gitlab 注册了 ssh 密钥
  2. 提交是not与 gpg 签署
  3. 每个人都使用注册的 ssh 密钥来使用 git bash

现在我们都知道author and committer只是 git 的元数据,很容易被欺骗,如下所示:

  1. git config --global --add user.email[电子邮件受保护] /cdn-cgi/l/email-protection
  2. git config --global --add user.name“隐身用户”
  3. git commit -m "你不知道我到底是谁" --author="Max Mustermann "
  4. git push

提交的元数据将如下所示:

Author:     Max Mustermann <[email protected] /cdn-cgi/l/email-protection>
AuthorDate: Mon Jun 4 13:12:47 2018 +0200
Commit:     Incognito User <I[email protected] /cdn-cgi/l/email-protection>
CommitDate: Mon Jun 4 13:13:26 2018 +0200

现在我想必须有一种方法可以找到用过的ssh key or 真人对于提交,因为终端和系统知道密钥,因此知道提交和推送背后的真实人员。

问题:不使用 gpg 签名就没有办法查出真人吗?

PS:不,我们并不是不信任对方来利用这一点,但我们很好奇并想了解。


Update- 复制 torek 评论中的信息,因为我相信这个上下文足够重要,它应该在答案本身中提供,而不仅仅是在评论中:


首先,你需要分开git from gitlab。据,直到...为止git就您而言,ssh 只是您可能用来连接服务器的协议之一。你的 ssh 密钥或其有效性对于 git 来说并不重要;这是您和您的服务器之间的事情,因为服务器会对您进行身份验证,以便它可以决定您是否有权通过 ssh 连接。

(服务器可能会执行更细粒度的授权检查,特别是对于像gitlab其全部功能就是与git集成。尽管如此,这是主持人的事,而不是 git 的事。)

像 gitlab 这样的托管服务可能会选择基于 ssh 密钥记录活动,也可能不会。即使他们这样做,也只能告诉您谁将提交推送到该服务器,这可能与作者不同or提交者。例如:

假设 Alice 编写了代码;她是作者。她将自己的作品寄给了鲍勃。 Bob 将代码放入本地 git 存储库中。 Bob 是提交者。 Bob 创建了一个捆绑文件并将其发送给 Cindy。现在,Cindy 将包含 Alice 代码的 Bob 提交加载到她的本地存储库中,然后使用以下命令推送到 gitlab她的 ssh 密钥。现在,git 本身并不关心 Cindy 在其中扮演的角色;她不是作者,也不是提交者。但如果 gitlab 选择基于 ssh 密钥记录活动,gitlab 可能会记录 Cindy 向该服务器引入了提交。

在 git 中创建可验证提交的方法是使用签名[1]。所以不,“如果不使用 [git 记录真人的机制],根本没有办法找出真人”。

请注意,这是由 Git 的分布式特性引起的。如果没有某种外部约束,就不可能判断 Cindy 是否合法地转发了 Alice 和 Bob 的工作。使用 SVN,有一个明确区分的中央服务器/真相来源,Alice 必须连接到该服务器来创建提交,之后 Bob 必须连接到该服务器,Cindy 必须连接到该服务器。每个人单独连接到服务器。与 SVN 不同,Git 并不认为这种情况一定会发生。如果您想自己强制执行此类策略,可以让您的服务器执行此操作。

-torek


[1] 虽然我不知道他们的观点是否已经改变,但至少一些 git 开发者很早就表示相信签名tags- 不直接签署提交 - 是正确的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在没有 gpg 签名的情况下验证 git 提交 的相关文章

  • git 分叉是如何工作的?

    所以我登录了 github 并 fork 了一个项目 每次原始存储库更新时 我的分叉存储库都会更新吗 或者我应该每次都从原始存储库进行分叉 这样我就不会错过对原始存储库所做的任何新更改 分叉是存储库的副本 分叉存储库允许您自由地尝试更改 而
  • php run git 收到“ssh 权限被拒绝”

    我正在尝试从浏览器中运行 git pull php 脚本 但我得到了 sh 连接到主机 git assembla com 端口 22 权限被拒绝 我的 PHP 脚本
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • .gitignore 文件夹内容[重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 上忽略 Git 存储库中的目录 https stackoverflow com questions 343646 ignoring directories in git repos
  • 我可以从命令行向 github 添加问题吗?

    我是 git 新手 我希望能够通过 github 绘制我的项目的计划和进度 问题是 这需要在 github com 上使用浏览器进行大量点击 并且我希望能够通过使用命令行程序来自动执行该任务 github 有命令行界面吗 有一个ghi ge
  • 在 Windows 上将 Mercurial (hg) 存储库转换为 Git (7)

    我现在真的很沮丧 我有一个现有的 hg 存储库 其中有几个月的编码历史 我想将其放入私有 Github 存储库中 以便我可以从那里对其进行处理 不幸的是我使用的是 Windows 我似乎找不到any转换我实际上可以正常工作的存储库的方法 实
  • 来自 eclipse 的部分 git 提交 (egit)

    假设我有一个有 2 个更改的文件 如何使用 egit 只提交其中之一 命令行版本可以在以下位置找到this https stackoverflow com questions 1085162 commit only part of a fi
  • 提交项目时我应该包含 .project 和 .classpath 吗?

    当我将 Web 应用程序提交到源代码管理时 我还应该包含 project 和 classpath 文件吗 我不认为这应该有任何区别 因为使用该项目的其他用户应该具有相同的项目设置 这种问题会让人们在一场永无休止的辩论中陷入困境 你基本上有两
  • 删除生成的 Javadoc 中的注释“Generate by Javadoc on

    javadoc 命令会自动插入一条注释 如下所示 在每个生成的 HTML 文件中 这完全阻止了版本化 javadoc 的更改跟踪 因为在重新生成文档时每个文件都会被修改 我问的上一个问题说服我不要对任何 javadoc 进行版本控制 但它也
  • 如何使用 git hook pre-merge-commit 获取原始合并分支名称

    我正在尝试使用新的 git hook pre merge commit 创建一个特定的脚本 但它没有参数 有什么解决方法可以让我获得正在合并的分支的名称吗 例子 在分支 myBranch 上 我调用 git merge testingBra
  • git 命令显示所有(轻量级)标签创建日期

    是否有一个衬垫可以向我显示所有 git 轻量级标签的创建日期 就像是 git show tags format date 我在这个发现link http osdir com ml git 2009 05 msg01404 html适合我需求
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 使用 TortoiseGit 创建 git 克隆时出现 SSL 证书问题

    我想在 TortoiseGit 的帮助下克隆 git 存储库 但出现错误 错误 SSL 证书有问题 请验证 CA 证书是否正常 细节 错误 14090086 SSL 例程 SSL3 GET SERVER CERTIFICATE 访问时证书验
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 如何将普通的 Git 存储库转换为裸存储库?

    如何将 普通 Git 存储库转换为裸存储库 主要区别似乎是 在普通的 Git 存储库中 你有一个 git存储库内的文件夹 包含构成工作副本的所有相关数据和所有其他文件 在裸露的 Git 存储库中 没有工作副本和文件夹 我们称之为repo g
  • 合并请求、审核流程以及在 GitLab 中使用注释

    我们目前正在评估 GitLab 在我们项目中的使用情况 我们发现稍有偏差的是审查合并请求时的评论 当在代码审查过程中输入一些注释并推送新的提交来解决这些注释时 问题就开始了 对提交所做的评论和对 更改 面板所做的评论都显示在 讨论 选项卡上
  • git Branch -d :致命 - 无法查找 HEAD 的提交对象

    假设我在一个裸存储库 远程 中 如果我尝试使用以下命令删除分支git branch d
  • 如何通过哈希显示提交的日期和时间

    I used git reflog识别我创建特定分支时的哈希值 我得到了哈希值fe1ddcdef 我还没有将此分支推送到远程 我现在正在尝试查找日期和时间fe1ddcdef发生 git reflog只告诉我 fe1ddcdef HEAD 1

随机推荐

  • Reactjs 中的 Axios 和 fetch 都在发出连续的本地主机网络请求

    这是来自 Express 后端和 MongoDB 数据库的路由代码以及来自前端的正常调用fetch 它返回index html代码并添加fetch http localhost 9000 它返回 CORS 错误 所以我添加了app use
  • MVC3 RadioButtonFor 带枚举

    我的模型中的 HtmlHelper RadioButtonFor 和枚举有问题 我有一个强类型视图 我希望复选框可以切换我的枚举属性 Enum cs public enum Values Value1 Value2 Model cs pub
  • 使用 Canvas 在 JS 中动画排序算法

    为了好玩 我尝试创建不同排序算法的可视化 但我遇到了 Canvas 动画的问题 我假设我只能在排序器方法中调用绘制函数 但这会导致浏览器锁定 直到数组完全排序 然后绘制一些中间帧 我将如何在排序方法中进行动画处理 下面是我到目前为止的代码
  • 在R中使用dplyr根据类型和滚动日期进行计数和标记

    我的问题类似于dplyr 使用滚动时间窗口对数据进行分组和汇总 变异 https stackoverflow com questions 36187931 dplyr grouping and summarizing mutating da
  • 如何解决 JSLint 警告“不要使用‘新’产生副作用”?

    为什么我会收到这些错误 第 329 行第 60 行字符的问题 不要使用 new 来产生副作用 new widget StyledDropdown dojo byId sTitle 第 330 行第 61 行字符的问题 不要使用 new 来产
  • Python 2 十进制的 Sin、cos 等?

    在Python 2 6中 我发现Decimal相当于sqrt pi is Decimal pi sqrt sin cos 或其他 反 三角函数是否有类似的函数 The docs http docs python org library de
  • 方法调用作为另一个方法调用的参数?

    我是abap OO 的新手 但之前用java开发过 并编写了一个abap cl caretaker 类 它应该处理数据库表及其本地副本 实习生表 上的操作 我想进行以下方法调用 caretaker gt show table caretak
  • Rails:使用remote: true 停止页面刷新

    我有一个projects show html erb页 Aproject has many project messages并从projects show html erb页面 用户可以创建一个新的project message然而 当新的
  • 模型绑定新Datatables 1.10参数

    在 Datatables 1 10 中 ajax 服务器端参数从 public class DataTableParamModel public string sEcho get set public string sSearch get
  • 如何将 AdMob GADBannerView 添加到每个视图

    我正在我的应用程序中实现一个 AdMob 横幅UIViewController 并且它正在工作 但我有很多视图 我想在每个屏幕上显示一个横幅 我如何实现一个出现在每个屏幕上的横幅 我正在尝试这个AppDelegate swift dispa
  • 谷歌地图添加标记

    我想在 Android 中的 Google 地图上添加标记 任何人都可以帮我做到这一点 如果你们有示例代码 这会对我有很大帮助 并且还告诉我如何设置地图片段的大小 提前致谢 use addMarker like myMap addMarke
  • 使用 Python 装饰器跟踪递归深度

    我正在尝试编写一个装饰器来跟踪Python中递归函数的递归深度 以递归函数为例 例如 def fib n if n 0 return 0 if n 1 return 1 else return fib n 1 fib n 2 通常 要跟踪递
  • 哈希函数增量意味着什么?

    例如 我听说 MurmurHash2 不是 增量 的 但 MurmurHash3 是增量的 这是什么意思 为什么它有用 增量哈希函数适用于以下情况 如果先前 哈希消息 M 稍微更新为新消息 M 然后 应该相当快地计算更新后的哈希值 消息 M
  • 我对同一个类有两个 Kotlin 扩展方法,但具有不同的通用签名,编译器会抱怨

    我正在为同一个类编写两个扩展函数 class Something
  • 不区分大小写的 XPath contains() 可能吗?

    我正在运行 DOM 的所有文本节点 并检查 nodeValue 是否包含某个字符串 html body text contains test 这是区分大小写的 不过我也想抓住Test TEST or TesT 这可以通过 XPath 在 J
  • 错误:资源 android:style/TextAppearance.Material.Widget.Button.Borderless.Colored 未找到

    我正在尝试构建一个具有compileSdkVersion 25和targetSdkVersion 25的项目 但我需要将两者更改为23 因此在更改compileSdkVersion 23和targetSdkVersion 23后我收到错误
  • javascript try catch 在 Firefox 中不能完全工作

    有人可以解释一下为什么会这样吗 不会向我发出 出现问题 的警报 也不会向我发出 正常 的警报 它在镀铬中工作得很好 但在 Firefox 中 它只是退出 它确实在 Web 控制台中显示错误 try catch 的全部目的是确保如果我输入
  • 是否有一个 C++ 标准类可以在作用域退出时将变量设置为值

    在成员函数的范围内 我想临时将成员变量设置为某个值 然后 当这个函数返回时 我想将此成员变量重置为给定的已知值 为了避免异常和多次返回 我用一个简单的 RAII 类来完成它 它是在成员函数的范围内定义的 void MyClass MyMem
  • 根据特定文本字符串选择列

    我正在尝试组合一个宏 该宏将选择某些列并将它们粘贴到新工作表中 问题在于 列往往会根据人们认为合适的方式添加和删除 这会破坏绝对引用 我一直在尝试修改使用宏记录器生成的基本宏 但我没有运气根据其内容选择列 我有一张每天从我们的数据库生成的工
  • 在没有 gpg 签名的情况下验证 git 提交

    我们开始使用 git 作为 VCS 之前使用 SVN 并发现在 git 中您可以轻松区分更改和提交背后的真实人物 现在我们想知道为什么做出这样的设计选择以及是否有我们忽略的事情 让我们假设以下情况 每个人都已经向 gitlab 注册了 ss