如何在 git 中强制执行作者/提交者身份验证?

2023-12-05

目前我们的项目中使用git进行版本控制。开发环境是内网(带有AD的Windows服务器),无法访问Internet。有没有办法配置 git 以使用作者和提交者的开发者域登录名?我们希望阻止开发人员自己提供这些信息。我在谷歌搜索这个问题时发现了这一点:

https://learn.microsoft.com/en-us/vsts/tfvc/comparison-git-tfvc

为了可审计性,它对 git 进行了说明: “您可以识别哪个用户推送了提交。(任何人都可以声明作者或提交者的任何身份。)您可以使用历史记录、比较和注释来识别何时进行更改、更改了什么。”

对于 TFVC: “因为您的团队将所有工作签入集中式系统,所以您可以识别哪个用户签入了变更集,并使用比较来查看他们更改了什么。查看文件,您可以对其进行注释以识别谁更改了代码块,以及他们什么时候这么做的。”

纯粹基于这些文本,我们似乎应该转向 TFVC。

我缺少什么?


Git

由于 Git 的分布式特性,一个用户仍然可以使用用户 ABC 进行更改,将其直接推送给用户名为 CBA 的同事,然后该同事将更改推送到中央服务器。

中央服务器无法知道所有这些提交最初是由用户 ABC 还是 CBA 编写的,更不用说推送数据的用户是否是编写代码的用户

这就是服务器维护代码的Pusher的原因。

Git 的解决方案是在分发提交之前使用 GPG 对提交进行签名。只有拥有私钥的用户才能代表自己签署提交。他们也可以签署其他人的更改,基本上表明他们已经审查了代码。您可以签署版本或在执行审核后签署,以确保到那时为止的一致性。超过该点对历史记录的任何更改都会使签名无效。我不建议对每个提交进行签名,因为签名在变基时会被破坏,在压缩合并时可能会丢失。

无法强制作者是 Git 分布式特性的固有特征。

包含一个 Windows 登录脚本来修补中央 git 配置文件以将用户名设置为您想要的用户名是相对容易的,甚至可能比预提交挂钩更容易。只需致电:

$ git config --global user.name "User's Name"
$ git config --global user.email "name@domain"

TFVC

在 TFVC 中,还存在使用 Shelvesets 将代码从一个开发人员移动到另一个开发人员的模型。搁置集可以由一位开发人员创建,由另一位开发人员取消搁置,然后签入中央存储库。这也会将签入的用户注册为作者。不是代码的作者。

原因是TFVC不区分作者和推送者。它假设两者始终相同。在很多情况下,这对于 Git 来说并非如此。

TFVC 签入也不像 git 提交那样可变,但事后可以使用 API 或 Visual Studio UI 轻松更改提交消息。签入笔记也可以。

想想看

任何人都可以对 USB 密钥进行更改,移动到另一台计算机并将更改放入另一个用户的工作区中。您甚至可以通过电子邮件发送,或者在 TFS 中获得正确许可后代表其他人行事。

可能的选择

如前所述,您可以:

  • 在 git 中使用预提交挂钩来检测 git 设置中名称/电子邮件的错误配置。
  • 通过策略自动设置正确的默认值
  • 使用服务器端服务挂钩自动标记包含不匹配的拉取请求(尽管我不会阻止它们,但在中央存储库之外的作者之间共享代码是一个非常强大的协作选项)。
  • 使用自定义构建步骤来标记构建期间的可疑更改,并且构建部分成功或完全失败。
  • 我怀疑您可以扩展 git 客户端(git 以这种方式非常可配置)以在执行提交时强制执行正确的名称,但这需要您分发自定义 git 配置。

Git 没有内置措施来确保配置的名称与实际用户匹配。但它的影响可能是有限的。只要人们在推送之前审查其他人的更改,Pusher 字段就会反映谁决定实际将这些更改作为主存储库的一部分,而不管代码的编写者是谁。在许多情况下,这是一个更为重要的决定。

如果您现在要做出选择,我的建议是不要使用 TFVC。

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

如何在 git 中强制执行作者/提交者身份验证? 的相关文章

  • “Git 推送非快进更新被拒绝”是什么意思?

    我正在使用 Git 来管理我的两台计算机和我的开发 我尝试将更改提交到 GitHub 但收到此错误 无法将一些参考推送到
  • 克隆包含所有子模块的 git 存储库

    我有一个工作 git 存储库 其中包含几个子模块 通过克隆不同的存储库获得 现在 我想要复制整个存储库 包含所有子模块 通过使用推送或克隆到另一台机器上的裸 git 存储库 我很高兴失去子模块的历史记录 我只是对保留它们的内容感兴趣 这可能
  • git push origin 分支名总是推送到 master

    我搜索了一下 但似乎找不到答案 在我可以访问的两个盒子上 当我执行 git push dry run origin mytestbranch 时 我得到以下结果 To email protected cdn cgi l email prot
  • Hudson 结帐卡在“git fetch”处

    我正在使用 git 版本 1 6 2 2 1669 g7eaf8 在 Hudson 1 314 上使用 Hudson Git 插件 0 7 3 当我触发构建时 Hudson 执行 git fetch 但它永远不会返回 我把一只卡在那里14天
  • 从分离的头进行 Git 推送

    我以超然的态度做出了一些改变 我想用 Git 将这些更改推送到这个独立的头 我不希望我的更改进入开发分支 当然也不想进入主分支 我正在与另一个人一起处理一个文件 分支示例 develop master HEAD detached at or
  • 如何预览 Git 中的隐藏内容?

    我想检查一个存储 并找出如果我将其应用于当前状态的工作树 它会发生什么变化 我知道我可以对存储进行 git diff 但这向我展示了工作树和存储之间的所有差异 而我只是想知道存储应用将改变什么 git stash show将向您显示最近存储
  • 克隆存储库而不将其设为原始远程存储库

    我正在从一台将被擦除的计算机上克隆一个 git 存储库 是否可以在不创建原始存储库的情况下克隆存储库origin master 或者我是否需要克隆它 然后删除远程分支 这是通过git remote rm origin Edit 存储库只有一
  • 如何查看上次提交和现在之间发生了什么变化(进行一些更改后)

    与此类似question https stackoverflow com questions 1552340 how to list the file names only that changed between two commits但
  • GitHub API:标记提交所属(与 git describe --tag 并行)

    我正在使用 GitHub API 进行实验octokit https github com octokit octokit rb红宝石 我的目标是能够提取提交 SHA 所属的 标签 现在我可以使用命令行轻松地执行此操作 gt git des
  • 具有单独 work_tree 的 Git 子模块

    我按照本页上的教程使通过 Git 部署我的网站变得简单 http toroid org ams git website howto http toroid org ams git website howto 到目前为止一切都很好 但是我最近
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • vscode通过SSH连接gitlab的问题

    我在尝试通过 SSH 连接到 GitLab 远程存储库时遇到问题 这里是迄今为止完成的步骤 成功生成 SSH 密钥 管理人员将密钥添加到存储库中 因此当我访问 GitLab 网站时 我可以提交和发布分支 我无法从 VSCODE 发布分支并收
  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • Git:如何变基到特定提交?

    我想变基到特定的提交 而不是另一个分支的 HEAD A B C master D topic to A B C master D topic 代替 A B C master D topic 我怎样才能做到这一点 您可以通过在您喜欢的提交上创
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • IntelliJ:查看本地和 git 提交/分支之间所有已更改文件的差异

    使用 IntelliJ 的 diff 查看器是检查代码的一种非常好的方法 因为您可以使用 IntelliJ 代码编辑器的所有功能 重构 完成等 在本地版本中进行更改 不幸的是 我还没有弄清楚当你在 IntelliJ 中进行代码审查时如何做最
  • 远程测试时如何搭建git开发环境

    这似乎是一个愚蠢的问题 但我觉得我对 GIT 相当了解 但我似乎无法按照我的意愿设置我的开发环境 我要么错过了一些非常简单的东西 要么我做错了 我在我的服务器上初始化了一个裸 git 存储库 将其克隆到我的本地计算机 提交我的文件并推送到原
  • git push heroku master 权限被拒绝

    我正在关注 ruby railstutorial 我运行命令 git push heroku master 它吐出了这个错误 Permission denied publickey fatal Could not read from rem
  • Git:显示分支之间的差异,忽略合并的提交

    我的存储库历史记录看起来像这样 x y z branch a b c d e master 我想获得 branch 完整历史记录的单个差异 即 像 git diff 输出 我不想要像 git log p 产生的一大堆差异 而不包括任何从 m

随机推荐