Fatal error "unsafe repository ('/home/repon' is owned by someone else)"
我发现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
这是在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仓库都被认为是不安全的,改变所有权似乎并不奏效。
这是因为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
error: wrong number of arguments, should be 2
- Steven Gann 2022-04-20
对于Windows来说,我不得不做以下工作。
在发生错误的 Git 仓库文件夹上点击右键,选择 "属性"。
选择安全选项卡,然后选择"高级"(左图:按"Erweitert")。
检查新打开的窗口顶部区域的所有者属性(右图:"Besitzer"),并调整它(右图:按"Ändern")。这必须是你的Windows工作账户
按OK,等待权利被设置,然后Git的错误信息应该是历史的
如果你在事后移动或重命名该目录,这个解决方案也能发挥作用。在我看来,你应该选择这个解决方案,而不是
git config --global --add safe.directory <repo-path>
你必须在每次对目录名进行修改时都要这么做。你也可以手动调整.gitconfig文件中的
C:\Users\<username>\.gitconfig
一旦你加入到安全名单中。
git init
,它将.git
文件夹中的所有东西(包括.git
文件夹)的所有者设为管理员用户。在你显示的第二个窗口中,我点击了'更改'按钮,左下方的'高级'打开了用户搜索,右侧的'现在查找'填充了列表,然后选择了与用非管理员终端制作的新的.git文件夹的用户相匹配的账户。我勾选了出现的新选项,将其应用于所有子容器和对象,git就不再抱怨了。
- Tom 2022-07-08
之前答案中的解决方案对我来说都不奏效,但改变版本库的所有权却奏效了。我正在运行Ubuntu 20.04.4(Focal Fossa)LTS,我运行了以下命令。
sudo chown -R username:group directory
作为自动化的一部分,我们的方案涉及多次调用一个脚本,我们不知道前期的工作空间。
因此,在我们的案例中,git config --global --add safe.directory *
在~/.gitconfig
中创建了多个条目。
git config --global --replace-all safe.directory '*'
帮助我们确保了没有重复的条目。
除了 Huber Thomas's 回答 对于 Windows,我必须使用 PowerShell 或 CMD 因为我在源代码控制管理文件夹中有一堆文件,所以我从一个位置移动到另一个位置。 TAKEOWN 命令处理得很好(如果有点慢)。
- 以自己的身份打开CMD(你不需要是一个管理员)。
- 导航到版本库文件夹(如果你有多个版本库,则导航到父版本库)。
- 运行
takeown /f . /r /d Y
。
这将以递归方式处理你当前文件夹中的所有文件夹,并将所有权设置为登录用户(大概是你)。
我也遇到过类似的问题--一个使用Git的网络应用程序无法访问仓库。
运行建议的命令(git config --global --add safe.directory /repo/path
)也不起作用,因为我是以 "我 "的身份运行的,而不是以 "www-data "用户的身份运行。
解决办法其实很简单--我在/var/www
目录下创建了.gitconfig
文件(在我的例子中,该目录是www-data用户的家),并把
[safe]
directory = /repo/path
在那里。
我可能是在说显而易见的事情,但我认为值得一提的是,运行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
,成功地解决了这个问题。
sudo git config --system --add safe.directory /homerepon
--system
将版本库标记为对所有用户都是安全的,包括www-data
。
你可以简单地打开Git bash,并输入以下命令
git config --global --add safe.directory '*'
除了已接受的答案之外,对于那些在Windows下得到"错误:参数数量不对,应该是2"的人,在提供目录参数时使用双引号,而不是单引号。
如:......。
git config --global --add safe.directory "D:/Source/Repos/SampleProject"
改变顶层目录的所有者就可以解决这个问题了。
在本地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
添加到gitconfig中的工作,但谁愿意对每个目录都这样做呢?太疯狂了!
对我来说,答案是:→不要使用sudo!。
在许多情况下,使用sudo并无大碍,而且如果你在用户可以触摸的东西和需要更多访问权的东西之间移动,它可以成为一种习惯。
如果我的用户创建了一个仓库,然后我用"sudo git...",我就会得到这个错误。我还把"sudo git..."部分放在一个别名中,所以我甚至没有明显地使用它。
我也有类似的问题,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)。
如果你有一个不同的用户拥有该目录,就会发生这种情况。例如,你的 Git 仓库位于 /var/www ,该目录由 www-data 拥有。现在,当你签入/使用一个非sudo用户账户,去/var/www执行Git操作时,例如
git branch
你会得到这个错误,所以要确保你有适当的目录权限。你可以通过运行chown来改变目录的所有权,或者将你当前的用户加入目录所有者所属的组。
如果你是在Linux上,并且喜欢明确的允许列表,你可以通过编辑Git配置手动实现,(例如,使用nano或Vim)。只要把文件夹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])
我在Windows上使用Sublime Text Merge时遇到这个问题。我试图应用这里提到的一些解决方案,但它们不起作用,所以我说。
如果问题出在文件夹上,我必须创建一个新的,所以复制并粘贴项目文件夹,删除旧的,用旧的名字重命名复制的,就是这样!这就是我的工作。
我想这在Linux上也应该是可行的,而且当制作项目文件夹的副本时,它是以正确的所有者身份创建的。
sudo chown -R [username]:[group directory]
这对我来说真的很有效(MacBook Air M1)。
除了收到上述错误/警告信息外,问题是exec()命令的结果没有被提供,因为有错误警告....[在末尾添加2>&1以查看错误]。
下面的这些步骤为我解决了这个问题:我在/etc中添加了一个配置文件,设置了它的权限,并将安全目录添加到....。
touch /etc/gitconfig
chown www-data:www-data /etc/gitconfig
nano /etc/gitconfig
配置文件的内容
[safe]
directory = /var/www/YOURPATH
这就解决了....,原来的代码可以工作了。
如果你从jenkinsfile声明式管道中运行,请在阶段的开始部分使用下面这行。
sh(label: 'Git config safedir', script: "git config --global --add safe.directory ${env.WORKSPACE}", returnStdout: true)?.trim()
env.WORKSPACE是发生git checkout的工作区目录,避免使用.*来表示目录。
我得到了问题中提到的同样的问题,下面也是如此。
错误:致命的:不安全的资源库(资源库被其他人拥有)要为这个目录添加一个例外,请调用。
git config --global --add safe.directory repo
但在ubuntu 18.04中,将 repo 添加为安全目录的做法并不奏效。
在这个答案的基础上,关于Windows中的Sourcetree,我不得不在命令行中以管理员的身份运行takeown
。
我还需要用DIR /Q检查我的repo文件夹中的所有文件和文件夹的所有权,以确保我把所有权改为正确的用户。
我通过克隆一个远程版本库,并检查该版本库的所有权和权限,与我从一台濒临死亡的电脑上复制过来的其他版本库相比,虽然Windows资源管理器中的安全标签似乎显示一切都符合要求,但DIR /Q显示,我无法打开的版本库的所有权与我克隆的版本库不同,并且可以访问它。
上述所有的解决方案都给我带来了下一个错误。
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
在我的案例中,我无法改变文件夹的所有权,而且git config --global --add safe.directory也没有解决这个问题。问题是,这个文件夹是以管理员身份在控制台创建的(win 10),而git是以普通用户身份运行的。我只是备份了该文件夹的内容,将其删除,并在不以管理员身份运行的情况下重新创建了它。