如何在 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 分支中的 777 个文件新功能 by rm example 我愿意承诺 Git 要求我手动删除每个已删除的文件 git rm file 对于所有名称不相似的 777 个文件 编写上述命令将花费大量时间 如何删除我的 Git
  • git reword 在变基期间显示合并冲突,但是 pick 工作正常

    我正在尝试用很少提交的另一个分支来重新建立一个分支 虽然提交包括合并提交 但我可以使用以下命令成功地对其进行变基git rebase i r m
  • 如何正确设置 Azure DevOps 和 GitHub 之间的双向同步

    我想通过执行以下操作在 Azure DevOps 和 GitHub 之间创建双向同步 使用 CI 触发器创建 Azure DevOps 管道 将更改从 Azure DevOps 存储库推送到 GitHub 中的分支 创建第二个管道 用于侦听
  • 如何更新我的裸存储库?

    我创建了一个裸存储库来发布我的存储库 但我不知道如何使用主存储库的当前状态更新裸存储库 如果您想复制主存储库中的所有对象 请在主存储库中执行此操作 git push all
  • 从“git diff”中排除文件

    我正在尝试排除一个文件 db irrelevant php 来自 Git diff 我尝试将文件放入db子目录名为 gitattributes与线irrelevant php diff我还尝试创建一个名为 git info attribut
  • 在 Bitbucket 中分叉存储库,保留分叉删除原始内容

    我在 Bitbucket 中分叉了一个存储库 但我想知道删除原始存储库后会发生什么 克隆也会被删除吗 别担心 分叉将继续存在
  • 通过 cron 进行 git 推送

    我正在尝试运行git push来自 cron 当我在 shell 上以交互方式执行命令时 一切顺利 从我的用户的 crontab 运行命令时 cron 会传递错误消息 Permission denied publickey 我认为这与查找或
  • git 可以忽略特定行吗?

    我在手机的本机浏览器上测试时使用 git 同步到phonegap 因此我有以下行 var isPhoneGap false 显然 我在构建时更改了这一点 但是有什么方法可以设置 git 来忽略这一行 或者我是否必须将其放入自己的文件中并以这
  • 反向合并具有干净历史记录的缝合功能分支

    我有这个 d0 f1 d1 d2 f2 d3 merge d4 f3 merge
  • 使用 Git 撤消临时更改

    假设我在 master 上并且有一个斑点 DEBUG FALSE CACHE SIZE 100 code code code 现在我开始在新分支中调试 DEBUG TRUE Don t forget to turn off CACHE SI
  • 使用 reposurgeon 将 svn repo 转换为 git

    我正在尝试使用 svn repo 转换为 git再生外科医生 http www catb org esr reposurgeon 这是我所做的 有一个具有 svn 名称 gt git 名称映射的 repo map 文件 svnadmin d
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 如何将 GitHub PR 的代码与其他分支的 PR 代码分开?

    我正在开发一个项目并解决问题 我正在为每个拉取请求 PR 创建一个不同的分支 上次我用他们的 PR 创建了两个不同的分支并解决了这两个问题 现在的问题是 我的两个拉取请求都与我在不同分支上推送的代码搞乱了 我借助以下命令在 git bash
  • 无法在 Eclipse 中运行从 Git 导入的项目

    我的 Eclipse 工作区中有一个来自 Github 的项目 通过 File gt Import gt Projects from GIT 但是 我无法运行该示例 因为 运行方式 下的唯一选项是 运行配置 转到 运行配置 后 我单击 浏览
  • 如何对私有 jelastic 环境进行版本控制

    为了跟踪 Jelastic 托管环境的配置 我想在 git 存储库中对其进行版本控制 该存储库应该是私有的 并包含多个具有不同版本的不同分支 例如master abc123 v1 1 我的第一次尝试是创建一个私有 github 存储库 其中
  • 删除 git Branch -a 列出的分支

    命令git branch a列出了一堆不在存储库上且不在本地分支上的分支 这些怎样才能删除呢 develop master remotes origin cloner 例如 remotes origin cloner曾经存在于存储库中 但它
  • Git 中的错误 - 致命:“/Users/username/Downloads/folder_name”位于存储库之外

    当我向 git 添加新项目时 出现此错误 Error fatal Users username Downloads folder name is outside repository 如何摆脱这个错误 我想 我需要给出当前的工作目录 但是
  • GIT LFS 跟踪旧数据

    我对 GIT LFS 有一个问题 我的项目达到了我正在跟踪 1 5GB 的 LFS 数据的程度 这比我拥有的数据要多得多 没有 LFS 的所有跟踪内容将为 108MB 我开始调查这个问题 看起来自从我开始重构并移动我的文件以来 git lf
  • 如何在 *Windows* 中将 Mercurial 存储库转换为 Git? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Windows 上将 Mercurial hg 存储库转换为 Git 7 https stackoverflow com questions 3267232 converting a mercur
  • Git:切换工作区(计算机)而不提交

    有没有办法在不进行提交 签出的情况下应用差异补丁或类似补丁 我的情况 我工作时经常在计算机之间切换 我的提交历史有一堆 开关机 消息 我最初的猜测是这可能会导致其他麻烦 但我想我可能会问是否有适合这种情况的合适的解决方案或工作流程 编辑 澄

随机推荐