git - 如何在 git 服务器存储库中实现可追溯性?

标签 git

我需要为大型内部开发人员团队设置一个集中式 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,然后欺骗他们的 LOGNAMESSH_CLIENT信息,尽管这种捏造是恶意的,并且让恶意用户推送访问 git 存储库本质上是危险的。有更可靠的方法来确定用户身份,但如果用户可以控制那里的登录脚本,那么当 Hook 以登录用户身份运行时,他们总是有可能以某种方式操纵它来破坏 Hook 工作。

通过这种方式,您可以为每个更改的分支获取和提交 SHA1。为了确保您始终可以轻松地检查历史记录,您可能还想确保配置变量 receive.denyDeletesreceived.denyNonFastForwards被设置为真。同样,为了拒绝摆弄这些配置,您希望避免用户拥有对存储库的 shell 访问权限。

如果您不介意非快进或分支删除,您仍然可以访问尚未通过 reflogs 修剪的旧提交,只要这些通过 core.logAllRefUpdates 启用即可。 .

关于git - 如何在 git 服务器存储库中实现可追溯性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1266799/

相关文章:

git - 如何让 TeamCity 仅为 PR 触发构建 master 分支?

git - 有人熟悉 git 错误 "missing object 0000000000000000000000000000000000000000 for refs/heads/..."吗?

git stash - 防止执行拼写错误的子命令

python - 将多个小型 git 存储库添加到更大的存储库

git - 如何从多个提交创建分支?

linux - 查找与某个 'count of commits' 匹配的所有 git 提交

git - 卡皮斯特 pull 诺 git :wrapper keeps asking for ssh passphrase

git - 在 Github 上,将 PR merge 到不同的分支

git - Jenkins API - 使用特定的 GIT 存储库查找所有作业

git - checkout 的 git 存储库的快照友好备份/复制 - 无需 rsync'ing .git 目录