致命错误“不安全的存储库(’/home/repon’ is owned by someone else)”

我发现 Apache 2的一个错误日志是致命的:

unsafe repository ('/home/repon' is owned by someone else)

发生这种情况是因为我在 PHP 代码中使用了 git rev-parse --symbolic-full-name --abbrev-ref HEAD',而且看起来 新的 Git 安全变更不再允许 www-data运行这个 Git 命令。

运行以下命令无效:

git config --global --add safe.directory /homerepon

有没有解决这个问题的办法?

Git 版本: 2.35.3
PHP 版本: 7.4
Apache2版本: 2.4.41

128904 次浏览

这是因为 Git 安全更新。

要使 Git 信任任何可以在 PowerShell中运行的目录:

git config --global --add safe.directory *

巴斯中,你应该避开 *以避免展开:

git config --global --add safe.directory '*'

*的支持仅在 Git 2.36中添加,如下所述: Git 2.36的亮点在评论中匿名

如果只信任一个目录,则可以运行此命令

git config --global --add safe.directory your-directory

随着 Git 2.35.2安全更新的发布,给你的漏洞得到了修复

以下是四种可能的解决方案:

  • 信任 Git 目录(如果知道目录内容是安全的,就这样做)
git config --global --add safe.directory /home/repon

这将 safe组添加到文件 ~/. gitconfig中,如下例所示:

[safe]
directory = /home/repon
  • 以正确的用户身份运行命令,例如:
sudo -u ubuntu -- git status

注意 : 这要求用户 www-data具有作为用户 ubuntu执行 Git 命令的权限(假设 Ubuntu是存储库所有者)。为了实现这一点,您需要在 /etc/sudoers.d/中添加一个新文件,其内容如下:

www-data ALL=(ubuntu) NOPASSWD: /usr/bin/git

这可能会涉及到安全问题,因此请先咨询您的安全人员。

  • 将 Git 存储库所有者更改为 www-data
sudo chown -R www-data:www-data /home/repon
  • 降级 Git 作为一个临时的解决方案,例如,在 Ubuntu 中:
apt install git-man=1:2.17.0-1ubuntu1 git=1:2.17.0-1ubuntu1

注意 : 至少在 Windows 上,弹出驱动器上的所有 Git 存储库似乎都被认为是不安全的,更改所有权似乎不起作用。

我也遇到过类似的问题——使用 Git 的 Web 应用程序无法访问存储库。

运行建议的命令(git config --global --add safe.directory /repo/path)也不起作用,因为我以“ me”而不是“ www-data”用户的身份运行它。

解决方案实际上非常简单——我在 /var/www目录中创建了 .gitconfig文件(在我的例子中是 www-data 用户的主目录) ,并将

[safe]
directory = /repo/path

那里。

对于 Windows,我必须做到以下几点:

  1. 右键单击发生错误的 Git 存储库文件夹并选择 Properties

  2. 选择 security 选项卡,然后选择“ Advanced”(左图: 按“ Erweitert”)

  3. 检查所有者的财产(右图: “ Besitzer”)在新打开的窗口的顶部区域,并适应它(右图: 按“安德森”)。这必须是您的工作 Windows 帐户

  4. 按下 OK并等待权限设置完成,然后 Git 错误消息应该会成为历史记录

    Enter image description here

此解决方案也适用于随后移动或重命名目录的情况。在我看来,你应该更喜欢这个解决方案

git config --global --add safe.directory <repo-path>

每次对目录名执行更改时都必须执行此操作。还可以手动调整 。 gitconfig文件

C:\Users\<username>\.gitconfig

一旦你加入了安全名单。

我也遇到过类似的问题,Phabricator无法显示我的存储库的内容(git log失败的原因与您的相同)。

我无法找出哪个用户正在运行 git命令,所以我无法想出一个适当的解决方案,直到我意识到我可以为所有用户编辑/创建一个全局 Git 配置文件。

我创建了这个文件:

sudo vi /etc/gitconfig`

把这个放进去:

[safe]
directory = /home/opt/phabricator_repo/1
directory = /home/opt/phabricator_repo/4
directory = /home/opt/phabricator_repo/5

OS: Ubuntu 20.04 (焦窝)

如果您有一个拥有该目录的不同用户,就会发生这种情况。例如,您的 Git 存储库位于 [俄语]中,[俄语]Www-data所有。现在,当您登录/使用非 sudo 用户帐户时,转到 [俄语]来执行 Git 操作,如

git branch

您将会得到这个错误,所以请确保您有适当的目录权限。可以通过运行 Chown更改目录所有权,或者将当前用户添加到目录所有者所属的组中。

在以前的答案中,没有一个解决方案对我有效,但是更改存储库的所有权对我有效。我正在运行 Ubuntu 20.04.4(Focal Fossa) LTS 并运行以下命令:

sudo chown -R username:group directory

我可能是在陈述一个显而易见的事实,但是我认为值得一提的是,运行 git config --global --add safe.directory /home/repon需要为 Www-data用户完成。

问题1: Www-data的 HOME 目录是 /var/www,因此使用 。 gitconfig文件可能存在安全风险(泄露服务器路径和配置)。

问题2: 对于 Apache/Ubuntu 20.04(Focus Fossa),HOME 环境变量在默认情况下没有被定义(/etc/apache2/envvars取消了它) ,所以配置没有被提取(git config --global$HOME 未设置中失败)。

我设法通过将存储库添加到 Git 的系统配置(即 git config --system --add safe.directory /home/repon)来解决这个问题。

如果您在 Linux 上并且喜欢显式地允许列表,那么您可以通过编辑 Git 配置(例如,使用 纳米机器人维姆)手动实现它。只需将文件夹 allowlist 放入配置文件的 [safe]部分:

nano ~/.gitconfig

下面是准备允许列表的 Python 脚本:

from glob import glob


def println(my_list):
print("\n".join(map(str, my_list)))


git_folders_list = sorted(glob("~/git/*", recursive=True))


println(["directory = " + d for d in git_folders_list])

作为自动化的一部分,我们的场景涉及多次调用一个脚本,我们不知道前面的工作空间。

因此,在我们的示例中,git config --global --add safe.directory *~/.gitconfig中创建了多个条目。

git config --global --replace-all safe.directory '*'帮助我们确保没有重复的条目。

我有这个问题在 Windows 与 崇高的文字合并。我试图应用这里提到的一些解决方案,但它们不起作用,所以我说:

如果是与文件夹的问题,我必须创建一个新的,所以复制和粘贴项目文件夹,删除旧的,重命名的副本的旧名称,这就是它!

我想这也应该在 Linux 上工作,并且当制作项目文件夹的副本时,它是由正确的所有者创建的。

更改顶级目录的所有者修复了它。

在本地 Ubuntu 台灯堆栈上运行 Laravel,我的设置包括以下命令:

sudo chown -R www-data /var/www/dirname

但是当 Www-data拥有 名字时,Git 出现了上面的错误。要修复它,我只需要更改顶级 名字的所有者和 。 git目录:

sudo chown myUserName /var/www/dirname

sudo chown -R myUserName /var/www/dirname/.git

除了公认的答案之外,对于那些在 Windows 下获得 “ error: 错误的参数数量,应该是2”的用户,在提供目录参数时使用双引号而不是单引号。

例如:

git config --global --add safe.directory "D:/Source/Repos/SampleProject"
sudo chown -R [username]:[group directory]

这对我来说真的很有用(MacBook Air M1)。

添加到 Gitconfig是有效的,但是谁想要对每个目录都这样做呢? ! 疯狂!

对我来说,答案是: →不要使用 Sudo!

在许多情况下,使用 Sudo并不会造成伤害,如果您在用户可以触摸的东西和需要更多访问权限的东西之间移动,那么使用 Sudo可能是一种习惯。

如果我的用户创建了一个存储库,然后我使用了“ sudo git...”,我得到了错误。我还有一个别名里的“ sudo git...”部分,所以我甚至没有明显地使用它。

除了用于 Windows 的 Huber Thomas 的 回答,我还必须使用 PowerShellCMD,因为我在源代码控制管理文件夹中有一大堆文件,我已经从一个位置移动到另一个位置。拿下命令很好地处理了这个问题(如果有点慢的话)。

  1. 以您自己的身份打开 CMD (您不需要是管理员)
  2. 导航到存储库文件夹(如果有多个文件夹,则为父文件夹)
  3. 运行 takeown /f . /r /d Y

这将递归地遍历当前文件夹中的所有文件夹,并将所有权设置为登录用户(假设是您)。

关于窗口中的 Sourcetree,我必须在命令行中以管理员的身份运行 takeown

我还需要使用 DIR/Q 检查我的 repo 文件夹中所有文件和文件夹的所有权,以确保我正在将所有权更改为正确的用户。

我通过克隆一个远程回购协议来检查这个回购协议的所有权和权限,这个回购协议是我从一台即将死亡的电脑上复制过来的。当文件资源管理器的安全标签显示一切都匹配的时候,DIR/Q 显示我无法打开的回购协议和我克隆的可以访问的回购协议拥有不同的所有权。

sudo git config --system --add safe.directory /homerepon

--system将存储库标记为对所有用户(包括 www-data)都是安全的。

除了接收上面的错误/警告消息之外,问题在于没有提供 exec ()命令的结果,因为出现了错误警告... ... [在末尾添加2 > & 1查看错误]

下面的步骤为我解决了这个问题: 我在/etc 中添加了一个配置文件,设置了它的权限,并将安全目录添加到其中... ..。

touch /etc/gitconfig
chown www-data:www-data /etc/gitconfig
nano /etc/gitconfig

配置文件的内容

[safe]
directory = /var/www/YOURPATH

这就解决了... 原始代码可以工作

如果您从一个 jenkinsfile 声明性管道运行,请在开始阶段时使用下面的代码行,

Sh (label: ‘ Git config safedir’,script: “ Git config —— global —— add safe.directory ${ env.WORKSPACE }”,returStdout: true) ?

WORKSPACE 是 git 签出发生的工作区目录,避免使用. * for 目录。

您可以简单地打开 Git bash 并输入以下命令

git config --global --add safe.directory '*'

我得到了问题中提到的同样的问题,以及下面的问题:

错误: 不安全的存储库(存储库由其他人拥有) 若要为此目录添加异常,请调用:

git config --global --add safe.directory repo

但是在 ubuntu 18.04中添加回购作为安全目录并不起作用

以上所有的解决方案都给了我下一个错误:

could not lock config file */etc/gitconfig: Permission denied

用这个解决方案: https://dirask.com/posts/Git-git-config-error-could-not-lock-config-file-Permission-denied-Kj825D

按照下一步的步骤:

  • 以管理员身份打开 Git Bash
  • 转到您的项目目录: cd“ C: path to our project name”

执行命令:

git config --system --unset credential.helper

在 linux 上使用 sudo 命令运行以下命令:

sudo git config --system --unset credential.helper

在我的例子中,我不能更改文件夹的所有权,git config —— global —— add safe.directory 没有修复它。问题在于这个文件夹是从作为管理员运行的控制台创建的(win 10) ,而 git 是用普通用户凭证运行的。我只是备份了文件夹的内容,删除了它,重新创建了它,而没有以管理员的身份运行。

我尝试了以上所有的答案,但仍然得到错误。尽管答案和步骤都是正确的,但是在使用 PyCharm 的 Windows 子系统 for Linux (WSL)上,它并不适合我。

因此,我把 WSL 和 PyCharm 终端放在一边,在我的 Windows PowerShell 中运行这个命令。我导航到。Gitconfig 文件夹是 \\wsl$\Ubuntu-20.04\home\user>,然后键入 .gitconfig打开它任何我的默认文本编辑器是 VisualStudio 代码。

我更新了下面的目录路径,但是没有引号:

directory = %(prefix)///wsl$/Ubuntu-20.04/home/user/project/mysite

您可以同样地将目录设置为 *以将所有文件夹标记为安全。在那之后,我废除了 PyCharm 的缓存,瞧!不会再有错误了。

希望能帮到别人。