假设我们有两个人在一个存储库上工作:
$ 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
有没有办法可以推断谁将恶意代码的提交推送到远程存储库?
答案 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