有没有办法使用 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 项目中获取当前和旧用户名?的主要内容,如果未能解决你的问题,请参考以下文章
`git describe` 与 gitlab python API