有没有办法使用 gitlab python api 从 gitlab 项目中获取当前和旧用户名?

Posted

技术标签:

【中文标题】有没有办法使用 gitlab python api 从 gitlab 项目中获取当前和旧用户名?【英文标题】:Is there a way to get both current and old usernames from a gitlab project with the gitlab python api? 【发布时间】:2022-01-05 21:15:06 【问题描述】:

我目前正在尝试将我的 gitlab 项目中的每一个提交都放在数据库中。我还有一个包含项目所有用户的表,我想与 Commit 表连接。

我通过命令 1-for user in self.project.users.list(all = True) 获取项目的所有用户。

我通过命令 2-for c in self.project.commits.list(all = True): 获得所有提交。

我试图使用每个提交的.author_name 属性将提交与用户相关联。但我注意到项目中的一些人在项目中更改了他们的名字,现在我从命令 1 获得的名字与通过 .author_name 属性给出的名字不同。

有没有办法解决这个问题?

【问题讨论】:

作者姓名、作者邮箱、提交者姓名和提交者邮箱是用户自定义的。 Git 允许用户使用任何有效的字符串来设置这些属性。如果没有映射表,Git 不知道哪些姓名/电子邮件属于同一用户。 Git 有邮件映射,git-scm.com/docs/gitmailmap。邮件映射帮助 git 命令将多个名称/电子邮件视为同一个用户。但是您仍然需要手动维护邮件映射。 不幸的是,由于@ElpieKay 提到的原因,无法追溯处理此问题。为了使这种关联在未来更加可靠,您可以配置推送规则以要求提交者电子邮件与现有 GitLab 用户匹配。这样,您可以关联提交电子邮件并确保具有相同电子邮件的相应 GitLab 用户应该存在。但是,用户可以更改自己的电子邮件,这可能会导致您遇到的相同原则问题。另一种可能的方式可能是要求对所有提交进行 GPG 签名,然后您可以使用它来更积极地识别用户。 【参考方案1】:

由于 git 提交信息独立于 GitLab 用户信息,因此没有可靠的方法来执行此操作 - 至少不能追溯或在任何情况下都具有 100% 的准确性/确定性。

例如,用户可以使用根本不存在的作者/提交者名称/电子邮件轻松创建提交。

git config --local user.name "A fictitious name"
git config --local user.email "nonexistant@example.com"
git commit -m "you cant find me"
git push  # works fine

但是,您可以通过一种或多种方法使这种查找和关联更加可靠。

推送规则以确保提交者电子邮件是 GitLab 用户

可以使用预定义的推送规则“检查提交作者是否是 GitLab 用户”设置 push rule,这将确保作者电子邮件与活动 GitLab 用户的电子邮件匹配。

这将使映射提交回 GitLab 用户更加可靠,因为作者电子邮件必须是有效/活跃的 GitLab 用户。

由于此规则,上述相同示例将无法推送。但是,随着时间的推移,用户可能会更改他们的电子邮件,这将导致您今天遇到类似的问题。

要求所有提交的 GPG 签名

类似于“检查提交作者是否是 GitLab 用户”推送规则,使这种关联更可靠的另一种可能方法是使用“拒绝未经验证的提交”推送要求所有提交经过验证的提交(GPG 签名)规则。这样,您可以更轻松地依赖签名信息将其与特定用户相关联。

如果提交被验证,这意味着提交是 (1) 使用 GPG 密钥签名的,(2) GPG 密钥电子邮件与 GitLab 用户的经过验证的电子邮件匹配,并且 (3) 提交电子邮件与 GPG 匹配关键电子邮件。

此外,GPG 签名将在签名本身中包含用户名和电子邮件。

for c in self.project.commits.list(as_list=False)
    signature = c.signature() # the commit needs to be signed for this to work
    print(c, 
          'was authored by', 
          signature['gpg_key_user_name'], 
          signature['gpg_key_user_email']
    )

这与 GitLab UI 中显示的已验证提交的信息基本相同:

对用户 API 的交叉引用

使用上述两种方法中的任何一种,提交信息(提交者电子邮件或 GPG 密钥 ID)都可以进一步与用户 API 交叉引用。例如,如果提交者仍然是活跃的 GitLab 用户,您可以使用 API 查找每个用户的电子邮件地址或 GPG 密钥,并将它们与提交信息交叉引用。

当然,这仅适用于在提交签名规则建立后创建的提交/项目。您不能为现有提交追溯创建此信息。其他一些caveats 申请。

因为用户 API 提供的信息会随着时间而改变(电子邮件和 GPG 密钥可以随着时间的推移添加/删除,或者用户可以从 GitLab 中完全删除),所以应该有理由认为它不会总是 可以从每个场景中的特定提交中获取 GitLab 用户 ID。

在这种情况下协调更改的唯一方法是审核随时间变化的状态(例如,通过参考 GitLab 服务器日志或自我管理实例上的审核日志)。

【讨论】:

以上是关于有没有办法使用 gitlab python api 从 gitlab 项目中获取当前和旧用户名?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Gitlab API 获取用户所有已加星标的项目

`git describe` 与 gitlab python API

Gitlab忘记root用户密码的解决办法

使用 Python 访问带有 GitLab API 的项目时出现 GitlabParsingError

python-gitlab库操作gitlab的API

更新文件并使用gitlab进行提交