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

回答 24 浏览 12.4万 2022-04-17

我发现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

XiaoFangyu 提问于2022-04-17
这与Q1Q2密切相关;请看这两个问题和那里的所有答案。torek 2022-04-17
另外,为了做出有根据的决定,请阅读你在问题中提到的URL,并研究它所提到的部分的git文档。你'只是由于最近引入的约束条件而出现了配置问题,不容易陷入安全问题。hakre 2022-04-17
相关的(更倾向于Windows)。我不能在Git中把父目录添加到safe.directory中Peter Mortensen 2022-06-04
该错误也在以下情况下重现。Git 版本 2.36.1.windows.1; Windows 11(22H2 Build 22621.160)Dmytro Kryvoruchenko 2022-06-19
可能与以LOCAL ADMIN RIGHTS运行Visual Studio有关? 我发现,当选择运行Visual Studio 2019并通过右键单击任务栏中的Visual Studio图标并选择解决方案(从出现的最近打开的列表中)来打开我的解决方案时,出现了这个错误。另一方面,如果我首先打开VS2019(以Local Admin的身份运行--我的默认),并从闪屏的"Open Recent"/"Pinned"中选择我的解决方案,一切都很好--而且git被识别,VS连接到仓库。Jonno 2022-07-06
24 个回答
#1楼 已采纳
得票数 137

这是在Git 2.35.2安全更新发布后开始出现的,该更新修复了这里描述的漏洞。鸣谢 @Juan-Kabbali

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

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

这就把safe组添加到了文件~/.gitconfig中,如本例所示。

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

Note:这需要用户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仓库都被认为是不安全的,改变所有权似乎并不奏效。

8ctopus 提问于2022-04-20
Peter Mortensen 修改于2022-06-05
这是个相当糟糕的错误信息。我希望它能同时告诉我,这个东西是谁的,以及git认为它应该是谁的。现在看来,这完全是一个错误,因为就我看来,这个信息是错误的,它是而不是,是由其他人拥有的。(windows)Andrew Savinykh 2022-06-10
在Windows上,添加文件夹的完整路径,如D:/Folder/SubFolder。这对我来说很有效。Dmytro Kryvoruchenko 2022-06-19
所有的解决方案都对我不起作用。我在一台Windows机器上工作,我的所有文件都在一个磁盘站上。我把DS上的一个文件夹作为一个驱动器添加到Windows中。我不能改变文件的所有权,因为它们属于DS用户。我在所有地方都添加了save.directory,但没有结果。我所有的资源库都有同样的问题,无论是本地还是github。DBR 2022-08-10
我不知道,也许你应该考虑在stackoverflow上问这个问题。8ctopus 2022-08-10
#2楼
得票数 122

这是因为Git安全更新的缘故。

要让Git信任任何目录,你可以在PowerShell中运行这个程序。

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

Bash中,你应该转义*,以避免扩展。

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

*的支持是在Git 2.36中才加入的,在这里提到。来自Git 2.36的亮点以及genonymous在评论中提到的

如果你只信任一个目录,你可以运行这条命令

git config --global --add safe.directory your-directory
night 提问于2022-04-20
Peter Mortensen 修改于2022-06-05
这是因为CVE-2022-24765的安全漏洞。Juan-Kabbali 2022-04-20
这是有道理的,因为这是git自己说要做的,但运行该命令会出现错误。error: wrong number of arguments, should be 2Steven Gann 2022-04-20
@StevenGann 请确保你在最后提供了目录的参数。genonymous 2022-04-20
@StevenGann 另外,*从Git 2.36开始支持,所以你可能需要更新它。genonymous 2022-04-20
你说的"Git safe update"是什么意思?Peter Mortensen 2022-05-12
#3楼
得票数 104

对于Windows来说,我不得不做以下工作。

  1. 在发生错误的 Git 仓库文件夹上点击右键,选择 "属性"。

  2. 选择安全选项卡,然后选择"高级"(左图:按"Erweitert")。

  3. 检查新打开的窗口顶部区域的所有者属性(右图:"Besitzer"),并调整它(右图:按"Ändern")。这必须是你的Windows工作账户

  4. OK,等待权利被设置,然后Git的错误信息应该是历史的

    Enter image description here

如果你在事后移动或重命名该目录,这个解决方案也能发挥作用。在我看来,你应该选择这个解决方案,而不是

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

你必须在每次对目录名进行修改时都要这么做。你也可以手动调整.gitconfig文件中的

C:\Users\<username>\.gitconfig

一旦你加入到安全名单中。

Huber Thomas 提问于2022-04-21
isherwood 修改于2022-08-05
这个解决方案对我来说是有效的,因为版本库的文件夹是由不同的用户拥有的。natenho 2022-04-23
这应该是在Windows上的默认解决方案。LunicLynx 2022-04-25
虽然这样做可以,但这并不理想。对我来说,这些资源库是由管理员拥有的,而不是我的特定账户(但这是一个管理员)。此外,我是这台电脑上唯一真正的用户。我有近百个仓库,手动改变每个仓库将是非常繁琐的。Jahmic 2022-05-26
在我的例子中,在2021年重新格式化和重装Windows后恢复的文件夹不再属于我的用户账户。显然,检查所有权是GIT在2.35.2.windows.1版本中的一个新功能。 恢复后创建的项目继续正常工作。重新获得项目文件夹顶层的所有权,包括"子容器和对象",就解决了这个问题。这需要一两分钟的处理时间,但这只是一次。Rich Shealer 2022-05-26
为了扩展这个问题,似乎我在管理终端中运行了git init,它将.git文件夹中的所有东西(包括.git文件夹)的所有者设为管理员用户。在你显示的第二个窗口中,我点击了'更改'按钮,左下方的'高级'打开了用户搜索,右侧的'现在查找'填充了列表,然后选择了与用非管理员终端制作的新的.git文件夹的用户相匹配的账户。我勾选了出现的新选项,将其应用于所有子容器和对象,git就不再抱怨了。Tom 2022-07-08
#4楼
得票数 7

之前答案中的解决方案对我来说都不奏效,但改变版本库的所有权却奏效了。我正在运行Ubuntu 20.04.4(Focal Fossa)LTS,我运行了以下命令。

sudo chown -R username:group directory
Ayush 提问于2022-04-22
Peter Mortensen 修改于2022-06-05
#5楼
得票数 6

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

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

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

urug99 提问于2022-04-26
Peter Mortensen 修改于2022-06-05
#6楼
得票数 6

除了 Huber Thomas's 回答 对于 Windows,我必须使用 PowerShellCMD 因为我在源代码控制管理文件夹中有一堆文件,所以我从一个位置移动到另一个位置。 TAKEOWN 命令处理得很好(如果有点慢)。

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

这将以递归方式处理你当前文件夹中的所有文件夹,并将所有权设置为登录用户(大概是你)。

tlbignerd 提问于2022-05-31
Peter Mortensen 修改于2022-06-05
我需要以管理员身份运行CMD,这样才能工作。我想这是由于我的一些软件库由于某种原因被本地管理员组所拥有。我不知道为什么会这样,因为我用同一个用户创建了所有的仓库,这是机器上唯一的账户。David Guerra 2022-06-24
在Windows 10上,它工作得很好。我很欣赏它。不过,有可能与Git的条款和配置相冲突?QMaster 2022-08-21
#7楼
得票数 4

我也遇到过类似的问题--一个使用Git的网络应用程序无法访问仓库。

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

解决办法其实很简单--我在/var/www目录下创建了.gitconfig文件(在我的例子中,该目录是www-data用户的家),并把

[safe]
        directory = /repo/path

在那里。

Michał Grabowski 提问于2022-04-20
Peter Mortensen 修改于2022-06-05
对于在ubuntu上运行nginx的人来说,这应该是一个确切的答案。注意,你还应该确保/var/www/.gitconfig的所有权是www-data,方法是进行sudo chown www-data .gitconfig。Timothy C. Lethbridge 2022-05-06
#8楼
得票数 3

我可能是在说显而易见的事情,但我认为值得一提的是,运行git config --global --add safe.directory /home/repon需要为www-data用户做。

问题1。www-data的HOME目录是/var/www,所以在那里有一个.gitconfig的文件可能会有安全风险(泄露服务器的路径和配置)。

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

我通过把仓库添加到Git的系统配置中,即git config --system --add safe.directory /home/repon,成功地解决了这个问题。

dregad 提问于2022-04-22
Peter Mortensen 修改于2022-06-05
我在OpenSuse(以wwwrun用户身份运行apache)上使用gitlist,这对我很有效。我尝试了其他答案中提到的所有建议,但都没有成功。在这里也发现了这个建议:github.com/klaussilveira/gitlist/issues/903XMAN 2022-08-14
#9楼
得票数 3
sudo git config --system --add safe.directory /homerepon

--system将版本库标记为对所有用户都是安全的,包括www-data

Jerome Jaglale 提问于2022-06-13
我在OpenSuse(以wwwrun用户身份运行apache)上使用gitlist,这对我很有效。我尝试了其他答案中提到的所有建议,但都没有成功。在这里也发现了这个建议。github.com/klaussilveira/gitlist/issues/903XMAN 2022-08-14
#10楼
得票数 2

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

git config --global --add safe.directory '*'
Takkam Darios 提问于2022-07-18
#11楼
得票数 1

除了已接受的答案之外,对于那些在Windows下得到"错误:参数数量不对,应该是2"的人,在提供目录参数时使用双引号,而不是单引号。

如:......。

git config --global --add safe.directory "D:/Source/Repos/SampleProject"
Pasha 提问于2022-05-20
KJH 修改于2022-05-25
#12楼
得票数 1

改变顶层目录的所有者就可以解决这个问题了。

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

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

但由于www-data拥有dirname,Git出现了上述错误。为了解决这个问题,我只需要改变顶层的dirname.git目录的所有者。

sudo chown myUserName /var/www/dirname

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

Debbie V 提问于2022-05-09
Peter Mortensen 修改于2022-06-05
#13楼
得票数 1

添加到gitconfig中的工作,但谁愿意对每个目录都这样做呢?太疯狂了!

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

在许多情况下,使用sudo并无大碍,而且如果你在用户可以触摸的东西和需要更多访问权的东西之间移动,它可以成为一种习惯。

如果我的用户创建了一个仓库,然后我用"sudo git...",我就会得到这个错误。我还把"sudo git..."部分放在一个别名中,所以我甚至没有明显地使用它。

Phreditor 提问于2022-05-23
isherwood 修改于2022-08-05
#14楼
得票数 0

我也有类似的问题,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

操作系统:Ubuntu 20.04(Focal Fossa)。

PJ127 提问于2022-04-21
Peter Mortensen 修改于2022-06-05
#15楼
得票数 0

如果你有一个不同的用户拥有该目录,就会发生这种情况。例如,你的 Git 仓库位于 /var/www ,该目录由 www-data 拥有。现在,当你签入/使用一个非sudo用户账户,去/var/www执行Git操作时,例如

git branch

你会得到这个错误,所以要确保你有适当的目录权限。你可以通过运行chown来改变目录的所有权,或者将你当前的用户加入目录所有者所属的组。

Rex Bengil 提问于2022-04-22
Peter Mortensen 修改于2022-06-05
#16楼
得票数 0

如果你是在Linux上,并且喜欢明确的允许列表,你可以通过编辑Git配置手动实现,(例如,使用nanoVim)。只要把文件夹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])
mirekphd 提问于2022-04-25
Peter Mortensen 修改于2022-06-05
#17楼
得票数 0

我在Windows上使用Sublime Text Merge时遇到这个问题。我试图应用这里提到的一些解决方案,但它们不起作用,所以我说。

如果问题出在文件夹上,我必须创建一个新的,所以复制并粘贴项目文件夹,删除旧的,用旧的名字重命名复制的,就是这样!这就是我的工作。

我想这在Linux上也应该是可行的,而且当制作项目文件夹的副本时,它是以正确的所有者身份创建的。

Leoalv 提问于2022-05-02
Peter Mortensen 修改于2022-06-05
#18楼
得票数 0
sudo chown -R [username]:[group directory]

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

mehmetakkus 提问于2022-05-21
Peter Mortensen 修改于2022-06-05
#19楼
得票数 0

除了收到上述错误/警告信息外,问题是exec()命令的结果没有被提供,因为有错误警告....[在末尾添加2>&1以查看错误]。

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

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

配置文件的内容

[safe] 
      directory = /var/www/YOURPATH

这就解决了....,原来的代码可以工作了。

user2612581 提问于2022-06-20
#20楼
得票数 0

如果你从jenkinsfile声明式管道中运行,请在阶段的开始部分使用下面这行。

sh(label: 'Git config safedir', script: "git config --global --add safe.directory ${env.WORKSPACE}", returnStdout: true)?.trim()

env.WORKSPACE是发生git checkout的工作区目录,避免使用.*来表示目录。

TheFixer 提问于2022-06-27
#21楼
得票数 0

我得到了问题中提到的同样的问题,下面也是如此。

错误:致命的:不安全的资源库(资源库被其他人拥有)要为这个目录添加一个例外,请调用。

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

但在ubuntu 18.04中,将 repo 添加为安全目录的做法并不奏效。

Prakash 提问于2022-07-29
#22楼
得票数 0

这个答案的基础上,关于Windows中的Sourcetree,我不得不在命令行中以管理员的身份运行takeown

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

我通过克隆一个远程版本库,并检查该版本库的所有权和权限,与我从一台濒临死亡的电脑上复制过来的其他版本库相比,虽然Windows资源管理器中的安全标签似乎显示一切都符合要求,但DIR /Q显示,我无法打开的版本库的所有权与我克隆的版本库不同,并且可以访问它。

Dennis 提问于2022-06-10
isherwood 修改于2022-08-05
#23楼
得票数 0

上述所有的解决方案都给我带来了下一个错误。

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
Yaroslav 提问于2022-09-10
#24楼
得票数 0

在我的案例中,我无法改变文件夹的所有权,而且git config --global --add safe.directory也没有解决这个问题。问题是,这个文件夹是以管理员身份在控制台创建的(win 10),而git是以普通用户身份运行的。我只是备份了该文件夹的内容,将其删除,并在不以管理员身份运行的情况下重新创建了它。

Mihai Drebot 提问于2022-10-28