我无法将父目录添加到 Git 中的 *safe.directory*

Shl*_*nts 188 git cve-2022-24765

更新 Git 后,v2.35.2.windows.1出现以下错误:

致命:不安全的存储库('F:/GitHub/my-project' 由其他人拥有)
要为此目录添加例外,请调用:

git config --global --add safe.directory F:/GitHub/my-project

我尝试将项目的父目录添加到.gitconfig,但它不起作用。

[safe]
    directory = F:/GitHub/
    directory = F:/Private/
Run Code Online (Sandbox Code Playgroud)
  • 有解决方法吗?
  • “‘x’ 属于其他人所有”到底是什么意思?

我不想将我正在处理的每个项目都添加到该.gitconfig文件中。

Mar*_*dor 173

从 Git v2.35.3 开始,可以禁用安全目录检查,这将结束所有“不安全存储库”错误(这也适用于最新的补丁版本 2.30-34)。

\n

这可以通过运行来完成:

\n

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

\n

它将向您的全局.gitconfig文件添加以下设置:

\n
[safe]\n    directory = *\n
Run Code Online (Sandbox Code Playgroud)\n

在禁用之前,请确保您了解此安全措施及其存在的原因。如果您的存储库存储在共享驱动器上,则不应执行此操作。

\n

但是,如果您 100% 的时间都是计算机的唯一用户,并且您的存储库存储在本地,那么从理论上讲,禁用此检查不会增加风险。

\n

另请注意,您当前无法将其与文件路径组合,因为该命令不会将通配符解释*为每个 \xe2\x80\x93 的运算符,它只需要"*"来表示“禁用安全存储库检查/认为所有存储库都是安全的”。

\n
\n

1 - 如果在 Windows 中的特定终端程序中失败,请尝试用双引号而不是单引号括起通配符(通过此 GitHub 问题):
\ngit config --global --add safe.directory "*"

\n

  • 是的,他们修复了一个安全问题,以至于必须禁用安全修复才能完成工作。惊人的。 (14认同)
  • @nonrectangle 如果您使用的是 Windows,您可以尝试在通配符“*”周围使用双引号而不是单引号。 (9认同)
  • @zcoop98 谢谢,很好。太糟糕了!通配符会很有用。 (5认同)
  • 谢谢@HalBurgiss。我没有意识到通配符仅在 git v2.35.1 及更高版本中可用。Ubuntu 20.04 附带 v2.25.1。Ubuntu 将安全补丁应用于旧版本的 git(包括 v2.25.1),因此会产生这个新错误,但没有修补对此通配符解决方案的支持。请参阅 MS Arun 的解决方案,在 Ubuntu 20.04 上使用 PPA 来获取最新的 git。 (4认同)
  • 我似乎无法让它发挥作用。如果我指定一个特定的目录,它确实有效。您确定此通配符设置有效吗? (2认同)
  • 又是我,抱歉,我以为我已经在我正在测试的服务器上升级了 git,但没有。这样做并按照 zcoop98 所说的进行操作后,现在工作正常了!耶! (2认同)
  • 这个设置对我没有任何作用,我仍然遇到同样的错误。获取文件夹的所有权也不是一个选择,因为问题发生在构建服务器上,并且不允许构建用户拥有包含 git 存储库的文件夹。 (2认同)

der*_*pda 99

回答

\n

这似乎与此漏洞公告有关:\n https://github.blog/2022-04-12-git-security-vulnerability-announced/

\n

我认为这与您的电子邮件关系不大,而与文件系统上目录的所有者关系更大。\n您当前登录的用户也是该文件夹的所有者吗?\n父文件夹怎么样?\另外,您是否从存储库目录中调用 git?\n更新才几个小时,所以我猜事情仍在不断变化。

\n

现在,正如 git 的消息所示,执行

\n
git config --global --add safe.directory F:/GitHub/my-project\n
Run Code Online (Sandbox Code Playgroud)\n

并确保您现在是git从内部拨打电话。F:/GitHub/my-project

\n

编辑:正如我们在下面的评论中发现的那样,包含该文件.git夹(git 存储库)的目录的父目录的所有者是问题所在。
\n重新克隆项目是一种独立于平台的方法,可确保您是所有者。

\n

边注

\n

我在 Linux 上使用 flutter 遇到了同样的问题,它在我的发行版上安装在/opt/flutter. 我不是以 root 身份工作,因此遇到了同样的问题。\n运行git config --global --add safe.directory /opt/flutter确实为我解决了问题。

\n

较长的编辑:澄清

\n

经过一夜良好的睡眠后,再次浏览有关该漏洞的帖子,我认为需要进行一些澄清。我将保留其余答案不变。
\n让我们看一下下面的简单目录结构。

\n
/home/\n\xe2\x94\x9c\xe2\x94\x80 tommy/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 .git/\n\xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 rental_space/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 mary/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 projects/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 phone_app/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 .git/\n\xe2\x94\x82  \xe2\x94\x82  \xe2\x94\x9c\xe2\x94\x80 anthony/\n
Run Code Online (Sandbox Code Playgroud)\n

在本例中,用户tommy在 下拥有自己的目录/home,但(由于某种原因)将空间出租给其他用户,在本例中mary为 和anthony
\nmary如果错误地在她的目录中执行git,但在她的项目之外phone_app,那么 oldgit将沿着目录树搜索.git存储库。它找到的第一个是来自 的/home/tommy/.git。这是一个安全风险,因为另一个用户(在本例中是任何可以充当 的用户tommy)都可能影响marygit 的执行并可能造成麻烦。
\n从 Git v2.35.2 开始,只要输入的目录属于 以外的用户,遍历就会停止mary。假设mary执行git/home/tommy/rental_space/mary/projects,然后git会签入projects,但发现没有.git。它将上升一个目录,签入mary,但再次找不到.git。然后它会再次上涨,但rental_space属于tommy,不mary。新的 git 版本将在这里停止并打印我们在问题中看到的消息。
\n将目录添加/home/tommy/rental_spacesafe.directory变量将允许 git 继续进行,但正如所解释的那样,存在安全风险。

\n

我这里使用了类似Linux的目录结构,但在Windows上也是如此。

\n

  • 似乎对于子模块,子模块文件夹和 .git 文件现在也需要正确的所有权。即,将父项目添加为 safe.directory 将包含子模块,但前提是它们的文件所有权与当前用户(或者可能是父 .git 文件夹)匹配。 (2认同)
  • @webaware 还不能评论你的答案(.....),但我认为你只做了一些小的澄清。我会稍微修改一下我的答案! (2认同)
  • 你是正确的,“user.*”设置是不相关的。安全问题是,在 WIndows 共享驱动器上(并且可能在任何多用户系统上,包括某些 Linux 系统),可能会诱骗人们运行特洛伊木马软件。Git 尝试使用操作系统的文件和目录所有权概念来解决此安全问题。 (2认同)
  • Windows 上的信任文件夹还存在其他问题。GitHub Desktop 的最新 Beta 版修复了该问题。Git 也无法检查 NTFS 文件夹的所有者是否是用户可能所属的安全组。 (2认同)

web*_*are 20

正如@derpda 所说,它与已修复的Git 安全漏洞有关。

至少在 Linux 上,您可以通过确保 Git 存储库的父文件夹归您所有来解决该问题。safe.directory如果您可以适当设置文件夹所有权,则无需添加配置设置。

如果您需要不同的所有权(例如,处理以不同用户身份运行的服务),请将您的文件夹添加到多值safe.directory配置设置中:

git config --global --add safe.directory /path/to/project
Run Code Online (Sandbox Code Playgroud)

  • 我希望这对我有用...我的文件夹位于我的 WSL 上,并且它与我的 Windows 系统是不同的用户... (7认同)

cam*_*ohe 19

升级到版本 2.35.2.windows.1 后,我在 Windows 上发现了同样的问题。

我能够通过获取包含 .git 文件夹及其中所有文件的文件夹的所有权来修复它。

这是假设您已经位于存储库文件夹中的命令:

takeown.exe /f . /r
Run Code Online (Sandbox Code Playgroud)

注意:如果工作文件夹内有多个存储库文件夹,您可能需要递归地获取工作文件夹及其子文件夹的所有权。执行需要更多时间,但您只需执行一次。

该命令在cmd.exe下如下所示:

takeown.exe /f C:\Users\%USERNAME%\Work /r
Run Code Online (Sandbox Code Playgroud)

或者在powershell.exe或 pwsh.exe下像这样:

takeown.exe /f $HOME\Work /r
Run Code Online (Sandbox Code Playgroud)

  • 我不建议递归地获取所有权。您只需要“.git”的父文件夹和“.git”本身的所有权。例如,当您的项目包含用作 docker 卷的文件夹时,使用您的建议就变得很重要。这些文件夹内的权限通常是故意不同的,并且对 git 的问题没有任何影响。 (7认同)
  • @Palec你是对的,但在我给出的docker卷的例子中,改变目录的所有权是一个糟糕的解决方案——只需用“cd”改变目录,这样你就可以安全地执行“git”。 (2认同)

S P*_*ran 8

对于使用NTFS挂载文件系统(可能是与 Windows 共享数据驱动器)的用户,您可以/etc/fstab通过附加defaults,uid=1000,gid=1000到它来编辑挂载选项。这是默认情况;您无法永久更改 NTFS 中的所有者.git。这些选项将使所有内容归您当前用户(而不是root)所有。


小智 8

对于(主要)Visual Studio 2022 用户:

\n

这是我的设置:

\n
    \n
  • git版本2.36.0.windows.1
  • \n
  • 从我的NAS安装SMB网络共享为 \\\\MyNas\\UserX:\\
  • \n
  • 远程分支被克隆到X:\\.
  • \n
  • 我的NAS和PC不在同一个域中
  • \n
  • 我的 IDE:Visual Studio 2022 Enterprise 17.2.0 Preview 4.0(最新)
  • \n
\n

到目前为止的问题:

\n

由于我的 NAS 和 PC 不在同一域中,因此我无法将我的 PC 用户设置为 NAS 目录的所有者。

\n

在 Visual\xc2\xa0Studio 中打开存储库时,控制台中显示此错误:

\n
Opening Repository:\nX:\\Repo\nGit failed with a fatal error.\nfatal: unsafe repository (\'//MyNas/User/Repo\' is owned by someone else)\nTo add an exception for this directory, call:\n\n    git config --global --add safe.directory \'%(prefix)///MyNas/User/Repo\'\n
Run Code Online (Sandbox Code Playgroud)\n

经过长时间的测试:

\n

问题是 Visual Studio 的便携式 Git 安装,其版本为2.35.2. 即使未选中“Git for Windows”组件,Visual Studio 仍使用其自己的 Git 安装,而不是我的全局 Git 安装。

\n

解决方案

\n
    \n
  1. 使用推荐的命令将存储库目录添加为安全目录:

    \n
    git config --global --add safe.directory \'%(prefix)///MyNAS/User/Repo\'\n\n# Or just trust any directory (not really recommended)\ngit config --global --add safe.directory *\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 更新 Visual Studio 使用的 Git 版本。\n(我刚刚从位于 的全局 Git 安装中获取文件C:\\Program Files\\Git\\mingw64\\bin并将它们粘贴到C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\Common7\\IDE\\CommonExtensions\\Microsoft\\TeamFoundation\\Team Explorer\\Git\\mingw64\\bin

    \n
  4. \n
\n

也许复制/粘贴文件的替代方法是让 Visual Studio 使用 Git 的全局安装,如 Stack\xc2\xa0Overflow 问题中所述:\n配置 Visual Studio 以使用系统安装的 Git.exe
\n注意:我尚未测试此替代方案,因为我已经覆盖了 Visual\xc2\xa0Studio 安装目录中的 Git 文件。

\n

主要注意事项:

\n
    \n
  • 最新的 Git 版本 (2.36.0) 支持安全/可信目录。
  • \n
  • 确保您的 IDE 使用最新版本的 Git。
  • \n
\n

  • 是的。只需指出“%(prefix)”实际上是“%(prefix)”,而不是某些变量替换。 (3认同)

小智 7

我的 Windows PC 上有一个本地存储库映射到网络文件夹:

n:\文件夹

这指向

\windows 服务器\文件夹\工作文件夹

当我尝试做的时候

n:\folder> git status
Run Code Online (Sandbox Code Playgroud)

出现了这个已知错误:

致命:不安全的存储库('//windows-server/folder/working-folder'由其他人拥有)要为此目录添加例外,请调用:

    git config --global --add safe.directory '%(prefix)///windows-server/folder/working-folder'
Run Code Online (Sandbox Code Playgroud)

在我的情况下,更改文件权限是不可能的。所以我尝试了

git config --global --add safe.directory '%(prefix)///windows-server/folder/working-folder'
Run Code Online (Sandbox Code Playgroud)

但这没有。我必须删除''!

解决方案:

git config --global --add safe.directory %(prefix)///windows-server/folder/working-folder
Run Code Online (Sandbox Code Playgroud)


M.S*_*run 6

对于 Ubuntu 20.xx 用户修复 - 2022 年更新:

使用此 PPA 更新 Git 提供了最新的稳定上游 Git 版本,修复了此问题。

sudo add-apt-repository ppa:git-core/ppa

sudo apt update

sudo apt install git
Run Code Online (Sandbox Code Playgroud)

参考: https: //git-scm.com/download/linux


小智 6

这发生在我身上,因为我重新安装了 Windows 系统,并且某些存储库文件夹的所有者是以前安装中的旧用户。所以 Git 不会让你直接使用这些文件夹。

\n

您可以通过Properties \xe2\x86\x92 Security \xe2\x86\x92 Advanced \xe2\x86\x92 Owner进行检查。如果当前所有者是类似“S-1-blah-blah”的东西,那么你遇到了和我一样的问题。

\n

如果您确定您是这些文件夹的真正所有者,则可以使用以下takeown命令:

\n
cd F:/GitHub/\ntakeown /f *\n
Run Code Online (Sandbox Code Playgroud)\n

/r我的情况似乎不需要该开关。

\n


go2*_*ull 6

在 Android 上的Termux中,您必须添加实际的git存储库,而不是父目录。

git config --global --add safe.directory /storage/emulated/0/src/go2null-dotfiles
Run Code Online (Sandbox Code Playgroud)

您也可以禁用该检查。

git config --global --add safe.directory '*'
Run Code Online (Sandbox Code Playgroud)


小智 6

在windows上,我用这个

git config --global --add safe.directory *
Run Code Online (Sandbox Code Playgroud)

或者

git config --global --replace-all safe.directory *
Run Code Online (Sandbox Code Playgroud)


小智 5

在这里添加这个,因为似乎没有其他人这样做,它对我有帮助。您可以通过以 root 身份运行来设置此系统范围,--system而不是--global,例如:

sudo git config --system --add safe.directory '*'