我需要为大型内部开发人员团队设置一个集中式 git 存储库。
我需要一些令人信服的机制,让我可以将给定的提交追溯到用户。据我了解this question ,这可能不是真正的 git 作者。我不希望将此信息用于任何用途(除了满足内部可追溯性要求外)。将提交与客户端的 IP 地址相关联被认为是足够可靠的,因此并不是很严格。 Grepping 日志文件是可以接受的,但我期待相当并发的提交。
有什么建议可以实现吗?我在这里故意尝试对解决方案类型(ssh、git-server、apache)开放
(是的,如果“joe”推送他从“osama”获取的更改,那么 joe 将在提交之前阅读这段代码)
最佳答案
您可以通过接收后 Hook 实现此目的。这个示例 Hook 只是回显可能记录到推送用户的详细信息,但这些详细信息可以通过系统日志或某种专用的登录机制记录。
# sample logging post-receive hook
echo This hook logs back to the pusher, but could append to syslog or something.
echo push from user $LOGNAME at $(date), ssh client details: $SSH_CLIENT
echo refs updated:
echo -------------
cat
echo -------------
对于 SSH_CLIENT
详细信息要准确,您可能希望确保用户没有直接的 shell 访问权限,否则他们可以通过 ssh 获得 shell,然后欺骗他们的 LOGNAME
和 SSH_CLIENT
信息,尽管这种捏造是恶意的,并且让恶意用户推送访问 git 存储库本质上是危险的。有更可靠的方法来确定用户身份,但如果用户可以控制那里的登录脚本,那么当 Hook 以登录用户身份运行时,他们总是有可能以某种方式操纵它来破坏 Hook 工作。
通过这种方式,您可以为每个更改的分支获取和提交 SHA1。为了确保您始终可以轻松地检查历史记录,您可能还想确保配置变量 receive.denyDeletes
和 received.denyNonFastForwards
被设置为真。同样,为了拒绝摆弄这些配置,您希望避免用户拥有对存储库的 shell 访问权限。
如果您不介意非快进或分支删除,您仍然可以访问尚未通过 reflogs 修剪的旧提交,只要这些通过 core.logAllRefUpdates
启用即可。 .
关于git - 如何在 git 服务器存储库中实现可追溯性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1266799/