谁将提交推送到远程存储库?

时间:2014-02-14 12:37:14

标签: git

假设我们有两个人在一个存储库上工作:

$ git config --global user.name "john"
$ git config --global user.email john@example.com

他登录远程存储库:john。

$ git config --global user.name "emma"
$ git config --global user.email emma@example.com

她登录远程存储库:emma。

假设John开始表现得像个坏男孩并且他运行这些命令

$ git config --global user.name "emma"
$ git config --global user.email emma@example.com

并提交一些讨厌的代码:P

有没有办法可以推断谁将恶意代码的提交推送到远程存储库?

1 个答案:

答案 0 :(得分:1)

此信息不是由git存储的,您必须编写一个接收挂钩(例如,预接收)并将其单独记录在您将维护的日志文件中。

Jonas Wielicki已经提到 gitolite 是更合适的解决方案,如果你可以运行它将是有利的 - 你将获得开箱即用的审计线索。 IP信息将位于.gitolite/logs

否则,返回接收挂钩:

  

处理来自客户端的推送时运行的第一个脚本是   前收到。它需要一个正在推送的引用列表   标准输入;如果它退出非零,则不接受任何一个。您可以使用   这个钩子做的事情,比如确保没有更新的引用   是非快进的;或检查执行推送的用户是否有   创建,删除或推送访问权限或访问权限以推送所有更新   他们用推送修改的文件   http://git-scm.com/book/en/Customizing-Git-Git-Hooks

以下是获取IP地址的方法:Subversion: Get ip-address of user in pre-commit hook?。是的,它适用于SVN,但您可以重复使用答案中引用的perl代码。

编辑。 git notes拯救 - 无需维护外部日志文件。

以下是您可以做的一个示例。我将模拟客户端IP以用于说明目的:

---- .git/hooks/pre-receive ---
#!/bin/sh

# When the connection is over SSH you can possibly
# obtain the IP with $SSH_CLIENT or $SSH_CONNECTION
# otherwise use netstat or lsof
#
CLIENT_IP="127.0.0.1"

echo Your IP is logged as : $CLIENT_IP

while read oldrev newrev ref
do
  git notes append -m "Commit $newrev forwarded from $oldrev by source: ${CLIENT_IP} at: $(date)" $newrev
done