Git for windows 2.35.2 无法添加异常 safe.directory

LNs*_*KTL 16 windows git

我用git version 2.35.2.windows.1的是我的win10。我的项目存储在运行 Ubuntu 的 NAS 中。我使用samba设置了SMB远程磁盘,并在win10上完成了所有必要的工作。

2.35更新后,我得到了

fatal: unsafe repository ('//192.168.1.120/sambashare/x' is owned by someone else) To add an exception for this directory, call:

git config --global --add safe.directory //192.168.1.120/sambashare/x
Run Code Online (Sandbox Code Playgroud)

在我按照指示操​​作后,git 发出了一个警告: warning: encountered old-style '//192.168.1.120/sambashare/x' that should be '%(prefix)//192.168.1.120/x'

我尝试稍微调整一下目录字符串(例如将其更改为Z://x,Z://192.168.1.120/x等),但这没有用。

我的 git 配置文件看起来像: [safe] directory = //192.168.1.120/sambashare/x ,我不太确定如何解决这个问题。

目前,我通过 ssh 完成所有 git 工作。提前感谢任何可能的解决方案。

mic*_*ege 14

  1. 前缀必须包含尾随/. 从字面上看是这样的:%(prefix)/
  2. 是否必须使用主机名、IP 地址或 FQDN取决于您安装网络共享的方式

运行net use以列出已安装共享的确切远程路径。

工作示例

如果网络共享安装为\\123.123.123.123\repoA运行

git config --global --add safe.directory %(prefix)///123.123.123.123/repoA
Run Code Online (Sandbox Code Playgroud)

如果网络共享安装为\\servername\repoB运行

git config --global --add safe.directory %(prefix)///servername/repoB
Run Code Online (Sandbox Code Playgroud)

如果网络共享安装为\\servername.company.com\repoC运行

git config --global --add safe.directory %(prefix)///servername.company.com/repoC
Run Code Online (Sandbox Code Playgroud)

git config --global --edit或者,您可以使用以下内容编辑配置

[safe]
    directory = %(prefix)///123.123.123.123/repoA
    directory = %(prefix)///servername/repoB
    directory = %(prefix)///servername.company.com/repoC
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 8

该警告特定于git-for-windows/gitpath.c,对于以以下开头的任何路径/

\n

尝试使用UNC 路径 \\\\192.168.1.120\\sambashare\\x会导致结果,如OP LNseyJt2X-24UJ4r7KTL的评论

\n
fatal: bad config output. \n
Run Code Online (Sandbox Code Playgroud)\n
\n

git config通过生成类似的东西输入它\\\\\\\\192.168.1.120\\\\sambashare配置文件中的生成内容输入它,但无法识别。

\n
\n

正确的形式,如michaelosthege\'s 答案所示,是添加%(prefix)/(不仅仅是%(prefix),是在路径之前

\n
%(prefix)///192.168.1.120/x\n
Run Code Online (Sandbox Code Playgroud)\n

或者降级 Windows 版 Git(如果您确实不想看到此警告),因为此消息来自最近的提交 66a6bcfv2.35.2.windows.1 的

\n
\n

mingw:弃用旧式运行时前缀处理interpolate_path()

\n

在 Windows 上,绝对 POSIX 路径需要转换为 Windows\none。

\n

我们过去常常将以 single 开头的路径解释为/相对于运行时前缀,但现在这些路径需要以 \n 为前缀%(prefix)/
\n现在让我们警告一下,但仍然处理它。

\n
\n

升级到 2.5.3(见下文),然后选择退出safe.directory=*

\n
\n

这一切都来自 With Git 2.35.2 (Q1 2022):

\n

请参阅Carlo Marcelo Arenas Bel\xc3\xb3n ( )的提交 6e7ad1e(2021 年 11 月 27 日)。\n请参阅提交 53ef17d提交 1f480d5提交 4d0b43a提交 93fbff0提交 87ed4fc提交 303b876提交 9bcd7a8提交 201b0c7提交 44de39c提交 6a2381a提交 cb95038、提交2a9a 586提交 898225b(2022 年 3 月 17 日),提交 fdcad5a(23 Mar 2022),并提交 8959555提交 bdc77d1(2022 年 3 月 2 日),作者:Johannes Schindelin ( )。\n (由Junio C Hamano合并-- --提交 f1b50ec中carenas
dscho
gitster中,2022 年 4 月 11 日)

\n
\n

setup_git_directory(): 为顶级目录添加所有者检查

\n

签署人:约翰内斯·辛德林

\n
\n
\n

在当前用户拥有的目录之外搜索 git 目录会带来安全风险。

\n

例如,在教育机构的计算机池中,通常存在“暂存”空间:具有足够空间的已安装磁盘,可以定期刷卡,任何经过身份验证的用户都可以在其中创建目录来完成其工作。\n仅在存在恶意制作的情况下
导航到启用了 Git 的此类空间PS1/scratch/.git/可能会导致帐户遭到泄露。

\n

这同样适用于运行 Windows 的多用户设置,如C:\\默认情况下每个经过身份验证的用户都是可写的。

\n

为了堵住这个漏洞,我们阻止 Git 接受当前用户以外的其他人拥有的顶级目录。
\n我们避免查看当前目录和顶级目录之间的每个目录的所有权(如果两者之间有的话),以避免引入性能瓶颈。

\n

这种新的默认行为显然与共享存储库的概念不兼容,我们期望顶级目录仅由其合法用户之一拥有。
\n为了重新启用该用例,我们添加了通过配置设置添加新默认行为异常的支持safe.directory

\n

safe.directory设置仅在系统和全局配置中受到尊重,而不是来自存储库配置或通过命令行,并且可以具有多个值以允许多个共享存储库。

\n

我们特别小心地向任何尝试使用共享存储库的用户提供有用的消息。

\n
\n

config现在包含在其手册页中中:

\n
\n

包括::config/safe.txt[]

\n
\n

git config现在包含在其手册页中中:

\n
\n

safe.directory

\n

这些配置条目指定 Git 跟踪的目录,即使它们由当前用户以外的其他人拥有,也被认为是安全的。默认情况下,Git 甚至会拒绝解析其他人拥有的存储库的 Git 配置,更不用说运行其钩子了,并且此配置设置允许用户指定例外情况,例如。对于有意共享的存储库(请参阅--shared中的 \n选项git init)。

\n

这是一项多值设置,即您可以通过添加多个目录\n git config --add。要重置安全目录列表(例如覆盖系统配置中指定的任何此类目录),请添加safe.directory具有空值的条目。

\n

仅当在系统或全局配置中指定时,才会考虑此配置设置,而在存储库配置中或通过命令行选项指定时,则不会考虑此配置设置-c safe.directory=<path>

\n

此设置的值是插值的,即~/<path>扩展为相对于主目录的\n路径并且%(prefix)/<path>扩展为相对于 Git(运行时)前缀的路径。

\n
\n
\n

2.35.3(2022 年 4 月)的变更:

\n

请参阅提交 d516b2d提交 2f0dde7提交 1f65dd6提交 1530434提交 09f66d6提交 17083c7(2022 年 4 月 13 日),作者:Junio C Hamano ( gitster)
\n请参阅Derrick Stolee ( )的提交 0f85c4a提交 e47363e(2022 年 4 月 13 日)。\n请参阅Matheus Valadares ( )提交的 bb50ec3(2022 年 4 月 13 日)。\n (由Junio C Hamano合并-- --提交 1ac7422中derrickstolee
Matheus28
gitster中,2022 年 4 月 13 日)

\n
\n

setup:选择不检查safe.directory=*

\n

签署人:Derrick Stolee

\n
\n
\n

在8959555中添加safe.directory (setup_git_directory():添加顶级目录的所有者检查,2022-03-02,Git v2.36.0-rc2 -合并(setup_git_directory():为顶级目录添加所有者检查,2022-03-02)在 v2.35.2 中发布,我们正在收到各种用户关于该功能的反馈。

\n

一些用户有一个非常大的共享存储库列表,并发现为每个存储库添加此配置很麻烦。

\n

在更困难的情况下,某些工作流程涉及在容器内运行 Git 命令。
\n容器边界阻止任何全局或系统配置将safe.directory值从主机传送到容器。
\n此外,容器几乎总是以与主机中目录的所有者不同的用户身份运行。

\n

为了简化这些用户所需的反应,请扩展 safe.directory 配置值的定义以包含可能的“*”值。
\n此值意味着所有目录都是安全的,提供单个设置来选择退出此保护。

\n

请注意,safe.directory 的空赋值会清除所有先前的值,并且“if (!value !*value)”条件已经是这种情况||

\n
\n

git config现在包含在其手册页中:

\n
\n

要完全选择退出此安全检查,请设置safe.directory为\nstring *。这将允许所有存储库被视为\n它们的目录已在safe.directory列表中列出。如果safe.directory=*在系统配置中设置了\n并且您想要重新启用此保护,则\n请在列出您认为安全的存储库之前\n使用空值初始化您的列表。

\n
\n
\n

Git 2.37(2022 年第 3 季度)safe.directory进一步明确了这一点。

\n

请参阅SZEDER G\xc3\xa1bor ( )的提交 756d159提交 424f315提交 f625639(2022 年 4 月 27 日)。\n (由Junio C Hamano 合并 -- --提交 1256a25中,2022 年 5 月 20 日)szeder
gitster

\n
\n

safe.directory:记录并检查它在环境中是否被忽略

\n

签署人:SZEDER G\xc3\xa1bor

\n
\n
\n

“safe.directory”的描述提到它在系统和全局配置中受到尊重,并在存储库配置和命令行中被忽略,但它没有提及它是否受到尊重或通过环境变量指定时被忽略(从提交 8959555添加“safe.directory”的提交消息也不会被忽略(setup_git_directory():添加顶级目录的所有者检查,2022-03-02,Git v2.36.0-rc2 --合并))。

\n

澄清在环境中指定时会忽略“safe.directory”,并添加测试以确保它保持不变。

\n
\n

git config现在包含在其手册页中中:

\n
\n

-c safe.directory=<path>配置,而不是在存储库配置中通过命令\n行选项或环境变量指定时

\n
\n
\n

随着最近的更新默认拒绝访问其他人的存储库,“ sudo make install”和“ ( man )停止工作。sudo git describe
\n本系列旨在放松它,同时保持 Git 2.37(2022 年第 3 季度)的安全性。

\n

请参阅Carlo Marcelo Arenas Bel\xc3\xb3n ( )的提交 b9063af提交 ae9abbb提交 5f1a3fe(2022 年 5 月 12 日)。\n (由Junio C Hamano合并-- --提交 2088a0c中carenas
gitster中,2022 年 5 月 26 日)

\n
\n

git-compat-util:如果运行特权,请避免目录所有权检查失败

\n

报告人:Guy Maurel
\n帮助人:SZEDER G\xc3\xa1bor
\n帮助人:Randall Becker
\n帮助人:Phillip Wood
\n建议人:Johannes Schindelin
\n签署人:卡洛·马塞洛·阿里纳斯·贝尔\xc3\xb3n

\n
\n
\n

bdc77d1 (“添加一个函数来确定路径是否属于当前用户”,2022-03-02,Git v2.36.0-rc2 -- merge ) 使用 检查正在运行的进程的有效 uid geteuid(),但没有\'考虑到该用户是 root 用户(因为git是通过sudo兼容工具调用的)并且uid其配置所信任的原始存储库不再已知,因此导致以下安全调用失败:

\n
guy@renard ~/Software/uncrustify $ sudo git describe --always --dirty\n[sudo] password for guy:\nfatal: unsafe repository (\'/home/guy/Software/uncrustify\' is owned by someone else)\n
Run Code Online (Sandbox Code Playgroud)\n

尝试使用这些工具创建的环境变量来跟踪原始用户 ID 来检测这些情况,并使用它来进行所有权检查。

\n

这假设用户在获得特权后运行的环境无法被篡改,并且还添加了代码来限制新行为仅在运行时才适用root,从而防止最常见的情况(以非特权运行)发生变化,但正因为如此,它会错过sudo使用(或等效工具)更改为另一个非特权用户的情况,或者用于提升权限的等效工具未以sudo兼容的方式跟踪原始 ID 的情况。

\n

由于与 的兼容性sudo,代码假定uid_t是无符号整数类型(标准不要求),但在其代码库中以这种方式使用来生成SUDO_UID。\n在已签名的
系统中,也可能会修补为未签名,并且可能会触发边缘情况和错误(如代码中所述),但它被认为不太可能发生,即使发生了,代码大多会安全地失败,因此没有尝试通过代码来检测它或阻止它,根据预期的用户反馈,这在未来可能会发生变化。uid_tsudo

\n
\n

git config现在包含在其手册页中中:

\n
\n

正如所解释的,默认情况下,Git 只允许您访问您自己(即运行 Git 的用户)拥有的存储库。
\n当 Git\nroot在提供 的非 Windows 平台中运行时sudo,\n但是,会git检查创建的SUDO_UID环境变量sudo\n并允许访问uid记录作为其值。\n这是为了使其易于执行安装过程中的常见顺序\n" make && sudo make install"。
\n在 \' sudo\' 下运行的 git 进程以 \' root\' 运行,但 \' sudo\' 命令导出环境变量来记录\n原始用户拥有哪个 ID。\n如果这不是您想要的并且git只想这样做信任\n拥有的存储库,那么您必须在调用之前从\n环境中root删除\n该SUDO_UID变量rootgit

\n
\n

和:

\n

使用 Git 2.37(2022 年第 3 季度),sudo git foo用于将原始用户拥有的存储库视为可以安全访问的存储库;现在,它也将 root 拥有的存储库视为安全的存储库(毕竟,如果攻击者可以制作 root 拥有的恶意存储库,则该框已为 0wned)。

\n

请参阅Carlo Marcelo Arenas Bel\xc3\xb3n ( )的提交 6b11e3d(2022 年 6 月 17 日)。\n (由Junio C Hamano 合并 -- --提交 694c0cc中,2022 年 6 月 17 日)carenas
gitster

\n
\n

git-compat-util:允许 root 访问SUDO_UIDroot 所拥有的两者

\n

帮助者:Johanness Schindelin
\n签署者:Carlo Marcelo Arenas Bel\xc3\xb3n

\n
\n
\n

sudo之前的更改引入了回归,如果使用becauseSUDO_UID优先,它将阻止root访问您自己拥有的存储库。

\n

通过允许 root 默认情况下访问由两个 uid 拥有的存储库来放松该限制,而无需添加 safe.directory 异常。

\n
\n

git conf