我不能在 Git 中将父目录添加到 * safe.directory *

在将 Git 更新为 v2.35.2.windows.1之后,我得到了以下错误:

不安全的存储库(‘ F:/GitHub/my-project’属于其他人)
若要为此目录添加异常,请调用:

Git config —— global —— add safe. 目录 F:/GitHub/my-project

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

[safe]
directory = F:/GitHub/
directory = F:/Private/
  • 有解决办法吗?
  • “‘ x’为别人所有”到底是什么意思?

我不想把我正在做的每一个项目都添加到 .gitconfig文件中。

96590 次浏览

回答我

这似乎与宣布一个弱点有关: Https://github.blog/2022-04-12-git-security-vulnerability-announced/

我认为它与您的电子邮件关系不大,更多的是与您文件系统中目录的所有者有关。 您当前登录的用户是否也是该文件夹的所有者? 父文件夹呢? 另外,您是否从存储库目录中调用 git? 更新只有几个小时,所以我猜事情还在变化中。

现在,正如来自 git 的消息所建议的那样,执行

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

并确保您现在正在从 F:/GitHub/my-project内部调用 git

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

旁注

我在 Linux 上使用 flutter 时也遇到了同样的问题,我的发行版本是在 /opt/flutter中安装的。我没有作为 root 用户工作,因此遇到了同样的问题。 运行 git config --global --add safe.directory /opt/flutter确实为我解决了这个问题。

更长的编辑: 澄清

在好好睡了一觉之后,再次浏览这篇关于漏洞的文章,我认为需要做一些澄清。剩下的我就不说了。
让我们看看下面这个简单的目录结构。

/home/
├─ tommy/
│  ├─ .git/
│  ├─ rental_space/
│  │  ├─ mary/
│  │  │  ├─ projects/
│  │  │  │  ├─ phone_app/
│  │  │  │  │  ├─ .git/
│  │  ├─ anthony/

在这种情况下,用户 tommy/home下拥有自己的目录,但是(出于某种原因)将空间出租给其他用户,在这种情况下是 maryanthony
如果错误地在 mary的目录中执行 git,但是在 phone_app项目之外,那么旧的 git将沿着目录树搜索 .git存储库。它首先找到的是来自 /home/tommy/.git的。这是一个安全风险,因为另一个用户(在本例中是任何可以充当 tommy的用户)可能会影响 mary对 git 的执行,并可能导致麻烦。
从 Git v2.35.2开始,一旦输入的目录属于 mary以外的用户,遍历就会停止。假设 mary/home/tommy/rental_space/mary/projects中执行 git,那么 git 将在 projects中检查,但是找不到 .git。它将上行一个目录,检入 mary,但是仍然没有找到 .git。然后它会再次上升,但是 rental_space属于 tommy,而不是 mary。新的 git 版本将在这里停止,并打印我们在问题中看到的消息。
将目录 /home/tommy/rental_space添加到 safe.directory变量将允许 git 继续,但是如前所述,存在安全风险。

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

作为 @ derpda 说,它与已经修复的 Git 安全漏洞有关。

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

如果您需要不同的所有权(例如,使用作为不同用户运行的服务) ,那么将您的文件夹添加到多值 safe.directory配置设置:

git config --global --add safe.directory /path/to/project

我们已经通过修复。Git/对象权限。由于权限问题,我们实际上无法在没有 sudo 的情况下添加文件。

在我的例子中,在 Ubuntu 20.04.4系统(Focal Fossa)上,项目文件夹的所有权设置为应用程序用户,例如, www-data: www-data ,但是。Git 文件夹的所有权设置为 根: 根

为了解决这个问题,我将项目文件夹的所有权更改为 根: 根 ,以便匹配其内容(包括 。 git文件夹)。然后,所有 Git 操作开始正常工作。

在我的例子中,我只是复制消息,编写 Sudo,然后粘贴消息。按下 Enter按钮后,问题就解决了。

例如:

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

‘ your-path’= 如消息中所示

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

我有时作为 管理员运行 VisualStudio,有时作为普通用户运行。

症状1

在 VisualStudio 中——打开本地文件夹时——似乎代码不再添加到源代码管理中。

Visual Studio 2019中打开解决方案: 以上消息出现在每个项目的 Git 输出窗口中。 在 Visual Studio 2022中打开一个解决方案: 它只说 One or more errors occurred.

症状2

当在执行 git log.git的父文件夹中打开一个正常的命令提示符时,将显示消息

fatal: unsafe repository ('C:/GIT/MyProject' is owned by someone else)
To add an exception for this directory, call:


git config --global --add safe.directory C:/GIT/MyProject

在管理员命令提示符中执行任何命令都没有错误。

解决方案

将 MyProject 文件夹的所有者更改为普通用户。之后,一切工作正常的用户,也作为 管理员

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

我能够通过获得包含。Git 文件夹和其中的所有文件。

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

takeown.exe /f . /r

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

这个命令在 Cmd.exe下是这样的:

takeown.exe /f C:\Users\%USERNAME%\Work /r

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

takeown.exe /f $HOME\Work /r

在 Windows 上,当您从提升的提示符创建文件夹时,它会将所有者设置为 行政人员组。

然后在它内部,当您使用非提升的提示符克隆存储库时,它会让您成为所有者。这足以触发一个新的 Git 验证。

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

这可以通过运行:

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

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

[safe]
directory = *

在禁用之前,如果存储库存储在一个共享驱动器上,则使用 确保你明白这个安全措施它为什么存在

但是,如果您在100% 的时间内是机器的唯一用户,那么您的存储库就存储在本地,那么禁用这个检查理论上应该不会增加风险。

还要注意的是,您目前不能将其与文件路径组合在一起,比如 该命令不将通配符 *解释为操作符——它只是将 "*"参数用于表示“禁用安全存储库检查/认为所有存储库都是安全的”。


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

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

使用这个 PPA 更新 Git 提供了最新的稳定的上游 Git 版本解决了这个问题。

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


sudo apt update


sudo apt install git

档号: https://git-scm.com/download/linux

这个问题发生在 Ubuntu 自动软件包更新之后。在检查了日志文件 /var/log/apt/history. log中的更新之后,我发现有两个 Git 包被更新了,而且在更新日期与 Phabricator混乱之后发生了更新。

git
git-man

我使用以下两个命令检查缓存中的前一个版本,并安装了旧版本。

apt-cache policy git:amd64

产出:

git:
Installed: (none)
Candidate: 1:2.17.1-1ubuntu0.10
Version table:
1:2.17.1-1ubuntu0.10 500
500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
500 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages
100 /var/lib/dpkg/status
***1:2.17.0-1ubuntu1*** 500
500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages

sudo apt-get install git=1:2.17.0-1ubuntu1
apt-cache policy git-man:amd64

产出:

git-man:
Installed: 1:2.17.1-1ubuntu0.10
Candidate: 1:2.17.1-1ubuntu0.10
Version table:
*** 1:2.17.1-1ubuntu0.10 500
500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
500 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages
100 /var/lib/dpkg/status
1:2.17.0-1ubuntu1 500
500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages

sudo apt-get install git-man=1:2.17.0-1ubuntu1

好的。在以前的答案中,如果目录不属于用户或者在用户的主目录之外,那么为了给这些答案添加更多内容,可以添加一点 PowerShell,我相信有人可以把它翻译成 巴斯,可以把这些目录添加到安全列表中。

下面的代码是在 Windows 上编写的,但是在 Linux 上,删除“-place’’,’/’”,因为它会破坏路径中任何带有空格的内容。

(ls D:\PowerShell\ParentFolder\ -Directory).FullName -replace '\\','/' | %{git config --global --add safe.directory $_}

关于 Ubuntu 20.04(Focus Fossa)Laravel Forge(用户隔离) :

我尝试按照前面的答案将 Git 更新到2.36,但这样做确实起到了 没有的作用。我尝试了 GitHub 的解决方案:

git config --global --add safe.directory GIT/MyProject

也正如之前的回答所建议的:

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

这些对我都不管用。

唯一起作用的是确保父目录和文件夹 。 git所在的项目目录的所有权与 由 Tc Blaize 解释的所有权相同。

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

这是我的装置:

  • Git 版本 2.36.0.windows.1
  • 安装的 中小企业网络共享从我的 NAS \\MyNas\User作为 X:\
  • 遥远的分支被克隆到 X:\上的一个目录中。
  • 我的 NAS 和 PC 不在同一个 域名中。
  • 我的 IDE: Visual Studio 2022 Enterprise 17.2.0 Preview 4.0(最新)

目前的问题是:

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

在 VisualStudio 中打开存储库时,控制台中出现了这个错误:

Opening Repository:
X:\Repo
Git failed with a fatal error.
fatal: unsafe repository ('//MyNas/User/Repo' is owned by someone else)
To add an exception for this directory, call:


git config --global --add safe.directory '%(prefix)///MyNas/User/Repo'

经过长时间的测试:

问题在于 VisualStudio 的可移植 Git 安装,其版本为 2.35.2。即使组件“ Git for Windows”未被选中,VisualStudio 仍然使用自己的 Git 安装,而不是我的全局 Git 安装。

强者

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

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

也许 复制/粘贴文件的替代方法是让 Visual Studio 使用 Git 的全局安装,就像 Stack Overflow 问题中描述的那样: 将 Visual Studio 配置为使用系统安装的 Git.exe
注意: 我还没有测试这个替代方案,因为我已经在 VisualStudio 安装目录中重写了 Git 文件。

主要注意事项:

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

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

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

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

这种情况发生在我身上,因为我重新安装了我的 Windows 系统,而且一些存储库文件夹的所有者是前一次安装中的老用户。所以 Git 不允许您直接使用这些文件夹。

你可以通过 物业保安高级老板来检查。如果现在的所有者是“ S-1-等等”之类的东西,那么你遇到了和我一样的问题。

如果你确定你是这些文件夹的 真正的主人,你可以直接使用 takeown命令:

cd F:/GitHub/
takeown /f *

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

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

N: 文件夹

这指向

服务器文件夹工作文件夹

当我试图做

n:\folder> git status

出现了一个众所周知的错误:

不安全的存储库(’//windows-server/file/working-file’为 为此目录添加异常,请调用:

    git config --global --add safe.directory '%(prefix)///windows-server/folder/working-folder'

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

git config --global --add safe.directory '%(prefix)///windows-server/folder/working-folder'

但是这个 没有起作用了,我必须移除它!

解决方案:

git config --global --add safe.directory %(prefix)///windows-server/folder/working-folder

在 Android 上的 特穆克斯中,您必须添加实际的 git回购目录,而不是父目录。

git config --global --add safe.directory /storage/emulated/0/src/go2null-dotfiles

您也可以禁用检查。

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

Git config —— global —— add safe.directory’*’//star food all

您可以创建所有目录是安全的。

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

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