当这个目录其实并不安全时,我该如何查看他人仓库的Git提交历史?

编程语言 2026-07-11

Git最近增加了一个安全性特性,开发者显然认为在 .git 目录的内容不可信时,进行任何Git操作的安全性处理超出了这个项目的范围。所以现在,如果一个仓库并非你拥有,当你尝试执行诸如 git log 之类的操作时,你会看到类似这样的错误:

fatal: detected dubious ownership in repository at '/home/somebodyelse/gitrepo'
To add an exception for this directory, call:

    git config --global --add safe.directory /home/somebodyelse/gitrepo

我在一个多用户环境中工作,我们希望用户账户能够构成一个相当强的安全边界。我想查看并了解另一位开发者在他们自己复制的我们共享项目中的Git活动,并把他们涉及分支的提交拉取到我的工作副本以便人工审阅,不让他们通过Git钩子等方式把命令伪装成我的能力,或通过Git这层互锁保护的表面暴露的其他入口来执行命令。

如果我不能直接把他们的仓库标记为“安全”,因为它并非真的可信,那么我如何查看它的 git loggit reflog 中可能包含的内容,甚至弄清楚他们检出了哪一个提交或分支?

解决方案

很容易。仅查看历史本身不会带来安全隐患,但你不掌控的随机仓库的管理设置里,可能会带来意想不到的情况。

所以当你真的不确定是否信任某人的设置时,也许他们有自定义的diff命令,嗯,既然如此,弄清楚那具体会做什么也许麻烦,使用任何仓库的工厂默认配置很容易:

git clone -s --mirror --template='' /path/to/repo `mktemp -d`
git -C $_ log

在一个4.9GB的工作仓库上,使用完全原厂的默认配置创建了一个136KB的 scratch克隆,体积小到我甚至懒得删除它或再用它,它会在一周内自动删除。


如果你确实信任该仓库的管理设置,那就更简单了。

Git正在努力保护你免受代码注入带来的惊喜,或许最不讨厌的麻烦就是那种管理员偏好的自定义diff,在你的环境中它们会压制你自己的偏好,或省略你实际上想看到的改动,诸如此类。

通常当你调用git时,你会使用当前目录或 -C 指定的起始目录,让Git从那里找出最可能的仓库,但如果你不这样做,而是明确告诉它去找到仓库目录的位置,Git就把这当成你已检查其管理设置并让Git使用它的保证。

你也可以按照它的指示注册你认为无论如何被发现都安全的仓库路径,但对于一次性用例,通常更容易直接把仓库(通常是 .git)目录传给它:

$ sudo -u nobody git log
commit efb9242f672ed4b2ea98f7e6c44baef4178dbaa4 (HEAD -> master)
Author: Nobody <[email protected]>
Date:   Tue Mar 24 18:39:06 2026 -0700

    example
$ git log
fatal: detected dubious ownership in repository at '/tmp/tmp.90xogMdOG2'
To add an exception for this directory, call:

        git config --global --add safe.directory /tmp/tmp.90xogMdOG2
$ git --git-dir=.git log
commit efb9242f672ed4b2ea98f7e6c44baef4178dbaa4 (HEAD -> master)
Author: Nobody <[email protected]>
Date:   Tue Mar 24 18:39:06 2026 -0700

    example
$
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章