我需要为大型内部开发人员团队建立一个集中的git存储库。
我需要一些令人信服的机制,它允许我将给定的提交追溯回用户。据我所知this question,这可能不是真正的git-authors。我不希望使用这些信息用于任何事情(除了满足可追溯性的内部要求)。将提交与客户端的IP地址相关联被认为足够可靠,因此它并不是非常严格。 Grepping日志文件是可以接受的,但我期待相当并发的提交。
我有什么建议可以实现这个目标吗?我故意试图在这里解决方案类型(ssh,git-server,apache)是开放式的
(是的,如果“joe”推动他从“osama”获取的更改,那么joe会在提交前阅读此代码)
答案 0 :(得分:5)
你可以通过post-receive钩子实现这一点。这个示例钩子只是回显可能记录到推送用户的可能细节,但可以通过syslog或某种专用的登录机制记录详细信息。
# 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
和{{ 1}} info,虽然这种捏造是恶意的,并且让恶意用户推送访问git存储库本质上是危险的。有更可靠的方法来确定用户身份,但是如果用户可以控制登录脚本,那么当钩子作为登录用户运行时,他们总是有可能以一种方式来操纵它以颠覆钩子工作。
通过这种方式,您可以为每个分支更改来自和提交SHA1。为了确保您始终可以轻松检查历史记录,您可能还需要确保将配置变量SSH_CLIENT
和receive.denyDeletes
设置为true。再次,为了拒绝摆弄这些配置,您希望避免用户具有对存储库的shell访问权。
如果您不介意非快速转发或分支删除,您仍然可以访问尚未通过reflog修剪的旧提交,只要这些通过received.denyNonFastForwards
启用即可。
答案 1 :(得分:2)
设置update hook。您将拥有旧的和新的提交ID以及引用名称。将此与提交者的IP相关联可能需要追溯您的父PID,直到您到达sshd,或者您只能记录当前用户的用户名。