我目前正在尝试将我的gitlab项目中的每一次提交都放到一个数据库中。我还有一个表,其中包含项目的所有用户,我希望将这些用户与提交表连接起来。
我通过命令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
属性给出的名字不同。
有没有办法解决这个问题?
发布于 2021-11-29 23:02:39
因为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用户,则可以使用该应用编程接口查找每个用户的电子邮件地址或GPG键,并使用提交信息对它们进行交叉引用。
当然,这只适用于在建立提交签名规则之后创建的提交/项目。您不能为现有的提交回溯创建此信息。其他一些caveats也适用。
由于user API提供的信息可能会随着时间的推移而变化(电子邮件和GPG密钥可能会随着时间的推移而添加/删除,或者用户可能会从GitLab中完全删除),因此不可能在每个场景中都从特定的提交中获得GitLab用户ID。
在这种情况下,协调更改的唯一方法是审计随时间变化的状态(例如,通过参考GitLab服务器日志或自我管理实例上的审计日志)。
https://stackoverflow.com/questions/70147627
复制相似问题