我用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
/
. 从字面上看是这样的:%(prefix)/
。运行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)
该警告特定于git-for-windows/git
path.c,对于以以下开头的任何路径/
尝试使用UNC 路径 \\\\192.168.1.120\\sambashare\\x
会导致结果,如OP LNseyJt2X-24UJ4r7KTL的评论:
fatal: bad config output. \n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n
git config
通过生成类似的东西输入它\\\\\\\\192.168.1.120\\\\sambashare
配置文件中的生成内容输入它,但无法识别。
正确的形式,如michaelosthege\'s 答案所示,是添加%(prefix)/
(不仅仅是%(prefix)
,是在路径之前
%(prefix)///192.168.1.120/x\n
Run Code Online (Sandbox Code Playgroud)\n或者降级 Windows 版 Git(如果您确实不想看到此警告),因为此消息来自最近的提交 66a6bcfv2.35.2.windows.1 的
\n\n\n\n
mingw
:弃用旧式运行时前缀处理interpolate_path()
在 Windows 上,绝对 POSIX 路径需要转换为 Windows\none。
\n我们过去常常将以 single 开头的路径解释为
\n/
相对于运行时前缀,但现在这些路径需要以 \n 为前缀%(prefix)/
。
\n现在让我们警告一下,但仍然处理它。
或升级到 2.5.3(见下文),然后选择退出safe.directory=*
这一切都来自 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\n
setup_git_directory()
: 为顶级目录添加所有者检查签署人:约翰内斯·辛德林
\n
\n\n在当前用户拥有的目录之外搜索 git 目录会带来安全风险。
\n例如,在教育机构的计算机池中,通常存在“暂存”空间:具有足够空间的已安装磁盘,可以定期刷卡,任何经过身份验证的用户都可以在其中创建目录来完成其工作。\n仅在存在恶意制作的情况下
\n
导航到启用了 Git 的此类空间PS1
/scratch/.git/
可能会导致帐户遭到泄露。这同样适用于运行 Windows 的多用户设置,如
\nC:\\
默认情况下每个经过身份验证的用户都是可写的。为了堵住这个漏洞,我们阻止 Git 接受当前用户以外的其他人拥有的顶级目录。
\n
\n我们避免查看当前目录和顶级目录之间的每个目录的所有权(如果两者之间有的话),以避免引入性能瓶颈。这种新的默认行为显然与共享存储库的概念不兼容,我们期望顶级目录仅由其合法用户之一拥有。
\n
\n为了重新启用该用例,我们添加了通过配置设置添加新默认行为异常的支持safe.directory
。这
\nsafe.directory
设置仅在系统和全局配置中受到尊重,而不是来自存储库配置或通过命令行,并且可以具有多个值以允许多个共享存储库。我们特别小心地向任何尝试使用共享存储库的用户提供有用的消息。
\n
config
现在包含在其手册页中中:
\n\n包括::config/safe.txt[]
\n
git config
现在包含在其手册页中中:
\n\n\n
safe.directory
这些配置条目指定 Git 跟踪的目录,即使它们由当前用户以外的其他人拥有,也被认为是安全的。默认情况下,Git 甚至会拒绝解析其他人拥有的存储库的 Git 配置,更不用说运行其钩子了,并且此配置设置允许用户指定例外情况,例如。对于有意共享的存储库(请参阅
\n--shared
中的 \n选项git init
)。这是一项多值设置,即您可以通过添加多个目录\n
\ngit config --add
。要重置安全目录列表(例如覆盖系统配置中指定的任何此类目录),请添加safe.directory
具有空值的条目。仅当在系统或全局配置中指定时,才会考虑此配置设置,而在存储库配置中或通过命令行选项指定时,则不会考虑此配置设置
\n-c safe.directory=<path>
。此设置的值是插值的,即
\n~/<path>
扩展为相对于主目录的\n路径并且%(prefix)/<path>
扩展为相对于 Git(运行时)前缀的路径。
请参阅提交 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\n
setup
:选择不检查safe.directory=*
签署人:Derrick Stolee
\n
\n\n在8959555中添加safe.directory (
\nsetup_git_directory()
:添加顶级目录的所有者检查,2022-03-02,Git v2.36.0-rc2 -合并)(setup_git_directory()
:为顶级目录添加所有者检查,2022-03-02)在 v2.35.2 中发布,我们正在收到各种用户关于该功能的反馈。一些用户有一个非常大的共享存储库列表,并发现为每个存储库添加此配置很麻烦。
\n在更困难的情况下,某些工作流程涉及在容器内运行 Git 命令。
\n
\n容器边界阻止任何全局或系统配置将safe.directory
值从主机传送到容器。
\n此外,容器几乎总是以与主机中目录的所有者不同的用户身份运行。为了简化这些用户所需的反应,请扩展 safe.directory 配置值的定义以包含可能的“*”值。
\n
\n此值意味着所有目录都是安全的,提供单个设置来选择退出此保护。请注意,safe.directory 的空赋值会清除所有先前的值,并且“if (!value !*value)”条件已经是这种情况
\n||
。
git config
现在包含在其手册页中:
\n\n要完全选择退出此安全检查,请设置
\nsafe.directory
为\nstring*
。这将允许所有存储库被视为\n它们的目录已在safe.directory
列表中列出。如果safe.directory=*
在系统配置中设置了\n并且您想要重新启用此保护,则\n请在列出您认为安全的存储库之前\n使用空值初始化您的列表。
Git 2.37(2022 年第 3 季度)safe.directory
进一步明确了这一点。
请参阅SZEDER G\xc3\xa1bor ( )的提交 756d159、提交 424f315、提交 f625639(2022 年 4 月 27 日)。\n (由Junio C Hamano 合并 -- --在提交 1256a25中,2022 年 5 月 20 日)szeder
gitster
\n\n\n
safe.directory
:记录并检查它在环境中是否被忽略签署人:SZEDER G\xc3\xa1bor
\n
\n\n“safe.directory”的描述提到它在系统和全局配置中受到尊重,并在存储库配置和命令行中被忽略,但它没有提及它是否受到尊重或通过环境变量指定时被忽略(从提交 8959555添加“safe.directory”的提交消息也不会被忽略(
\nsetup_git_directory()
:添加顶级目录的所有者检查,2022-03-02,Git v2.36.0-rc2 --合并))。澄清在环境中指定时会忽略“safe.directory”,并添加测试以确保它保持不变。
\n
git config
现在包含在其手册页中中:
\n\n\n
-c safe.directory=<path>
配置,而不是在存储库配置中通过命令\n行选项或环境变量指定时。
随着最近的更新默认拒绝访问其他人的存储库,“ sudo make install
”和“ ( man )停止工作。sudo git describe
\n本系列旨在放松它,同时保持 Git 2.37(2022 年第 3 季度)的安全性。
请参阅Carlo Marcelo Arenas Bel\xc3\xb3n ( )的提交 b9063af、提交 ae9abbb、提交 5f1a3fe(2022 年 5 月 12 日)。\n (由Junio C Hamano合并-- --在提交 2088a0c中carenas
gitster
中,2022 年 5 月 26 日)
\n\n\n
git-compat-util
:如果运行特权,请避免目录所有权检查失败报告人:Guy Maurel
\n
\n帮助人:SZEDER G\xc3\xa1bor
\n帮助人:Randall Becker
\n帮助人:Phillip Wood
\n建议人:Johannes Schindelin
\n签署人:卡洛·马塞洛·阿里纳斯·贝尔\xc3\xb3n
\n\nbdc77d1 (“添加一个函数来确定路径是否属于当前用户”,2022-03-02,Git v2.36.0-rc2 -- merge ) 使用 检查正在运行的进程的有效 uid
\ngeteuid()
,但没有\'考虑到该用户是 root 用户(因为git
是通过sudo
兼容工具调用的)并且uid
其配置所信任的原始存储库不再已知,因此导致以下安全调用失败:Run Code Online (Sandbox Code Playgroud)\nguy@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
尝试使用这些工具创建的环境变量来跟踪原始用户 ID 来检测这些情况,并使用它来进行所有权检查。
\n这假设用户在获得特权后运行的环境无法被篡改,并且还添加了代码来限制新行为仅在运行时才适用
\nroot
,从而防止最常见的情况(以非特权运行)发生变化,但正因为如此,它会错过sudo
使用(或等效工具)更改为另一个非特权用户的情况,或者用于提升权限的等效工具未以sudo
兼容的方式跟踪原始 ID 的情况。由于与 的兼容性
\nsudo
,代码假定uid_t
是无符号整数类型(标准不要求),但在其代码库中以这种方式使用来生成SUDO_UID
。\n在已签名的
系统中,也可能会修补为未签名,并且可能会触发边缘情况和错误(如代码中所述),但它被认为不太可能发生,即使发生了,代码大多会安全地失败,因此没有尝试通过代码来检测它或阻止它,根据预期的用户反馈,这在未来可能会发生变化。uid_t
sudo
git config
现在包含在其手册页中中:
\n\n正如所解释的,默认情况下,Git 只允许您访问您自己(即运行 Git 的用户)拥有的存储库。
\n
\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
变量root
git
。
和:
\n使用 Git 2.37(2022 年第 3 季度),sudo git foo
用于将原始用户拥有的存储库视为可以安全访问的存储库;现在,它也将 root 拥有的存储库视为安全的存储库(毕竟,如果攻击者可以制作 root 拥有的恶意存储库,则该框已为 0wned)。
请参阅Carlo Marcelo Arenas Bel\xc3\xb3n ( )的提交 6b11e3d(2022 年 6 月 17 日)。\n (由Junio C Hamano 合并 -- --在提交 694c0cc中,2022 年 6 月 17 日)carenas
gitster
\n\n\n
git-compat-util
:允许 root 访问SUDO_UID
root 所拥有的两者帮助者:Johanness Schindelin
\n
\n签署者:Carlo Marcelo Arenas Bel\xc3\xb3n
\n\n\n
sudo
之前的更改引入了回归,如果使用becauseSUDO_UID
优先,它将阻止root访问您自己拥有的存储库。通过允许 root 默认情况下访问由两个 uid 拥有的存储库来放松该限制,而无需添加 safe.directory 异常。
\n
git conf