致命:不安全的存储库(“/home/repon”归其他人所有)

fatal: unsafe repository ('/home/repon' is owned by someone else)

我发现来自 apache2 的致命错误日志:unsafe repository ('/home/repon' is owned by someone else)

这是因为我在 PHP 代码中有 git rev-parse --symbolic-full-name --abbrev-ref HEAD',看起来 new git safety change 不再允许 www-data 到 运行 这个 git命令。

git config --global --add safe.directory /homerepon 不起作用。有没有人有解决此问题的解决方法?

Git版本:2.35.3

PHP版本:7.4

Apache2 版本:2.4.41

这是因为 git 安全更新。

要使 Git 信任任何目录,您可以 运行 在 powershell 中这样做:

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

在 bash 中你应该转义 * 以避免扩展:

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

仅在 Git 2.36 中添加了对 * 的支持,如以下位置所述:https://github.blog/2022-04-18-highlights-from-git-2-36/ and by genonymous in the comments.

如果只信任一个目录,可以运行这个命令

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

随着 git 2.35.2 安全更新的发布开始出现,该更新修复了 here 中描述的漏洞。学分@Juan-Kabbali

这里有 4 种可能的解决方案:

  • 信任 git 目录(如果您知道目录内容是安全的就这样做)
git config --global --add safe.directory /home/repon

这将添加到 ~/.gitconfig safe 组,如本例所示

[safe]
    directory = /home/repon
  • 运行命令为正确的用户,例如:
sudo -u ubuntu -- git status

注意:这需要用户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 的 Web 应用程序无法访问存储库。
运行 建议的命令 (git config --global --add safe.directory /repo/path) 也不起作用,因为我 运行 它是 'me',而不是 'www-data' 用户。
解决方案实际上非常简单——我在 /var/www 目录(在我的例子中是 www-data 用户的家)中创建了 .gitconfig 文件,然后将

[safe]
        directory = /repo/path

那里。

对于 Windows,我必须执行以下操作:

  1. 右键单击发生错误的 git 存储库文件夹
  2. Select安全选项卡,然后选择“高级”(左图:按“Erweitert”)
  3. 检查新打开的顶部区域的所有者属性(右图:“Besitzer”)window并进行调整(右图:按“Ändern”),这一定是你的作品Windows 账户
  4. 按确定并等待权限设置,然后 Git 错误消息应该是历史记录

如果您之后移动或重命名目录,此解决方案也适用。在我看来你应该更喜欢这个解决方案

git config --global --add safe.directory <repo-path>

每次更改目录名称时都必须执行此操作。您也可以手动调整

中的 .gitconfig 文件
C:\Users\<username>\.gitconfig

一旦您添加到安全列表。

我遇到了类似的问题,Phabricator 无法显示我存储库的内容(git log 失败,原因与您的相同)。 我不知道哪个用户是 运行 git 命令,所以我无法想出一个合适的解决方案,直到我意识到我可以 edit/create 全局 git 配置所有用户的文件。

我创建了这个文件: sudo vi /etc/gitconfig.

然后把这个放进去:

[safe]
        directory = /home/opt/phabricator_repo/1
        directory = /home/opt/phabricator_repo/4
        directory = /home/opt/phabricator_repo/5

OS: Ubuntu 20.04

如果您有其他拥有该目录的用户,就会发生这种情况。例如,您的 git 存储库位于 /var/www 中,属于 www-data。现在,当您是 signed-in/using 一个 non-sudo 用户帐户并转到 /var/www 执行 git 操作时,例如

$ git branch

您将收到此错误,因此请确保您具有适当的目录权限。您可以通过 运行 CHOWN 更改目录所有权或将您当前的用户添加到目录所有者所属的组

None 以上解决方案对我有用,但更改存储库的所有权确实有效。我是 运行 Ubuntu 20.04.4 LTS 并且我 运行 执行以下命令:

sudo chown -R username:group directory

我可能说的很明显,但我认为值得一提的是 运行 git config --global --add safe.directory /home/repon 需要为 www-data 用户完成.

问题 1:www-data 的 HOME 目录是 /var/www,所以有一个 .gitconfig 文件可能是安全的风险(泄露服务器路径/配置)。

问题 2:在 Apache/Ubuntu 20.04 中,默认情况下未定义 HOME 环境变量(/etc/apache2/envvars 取消设置),因此配置未获得 picked-up(git config --global 失败 fatal: $HOME not set).

我设法通过将存储库添加到 git 的系统配置来解决问题,即 git config --system --add safe.directory /home/repon

如果您使用 linux 并且更喜欢显式 allow-listing,您可以通过编辑 Git 配置手动实现它(例如使用 nano 或 vim)。只需将文件夹 allow-list 放入配置文件的 [safe] 部分:

$ nano ~/.gitconfig

这里有一个 python 脚本来准备 allow-list:

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])

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

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

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

我在使用 Sublime Merge windows 时遇到了这个问题,我试图应用这里提到的一些解决方案,但它们没有用所以我说:如果问题出在文件夹上,我必须创建一个新的一,所以复制并粘贴项目文件夹,删除旧的,用旧名称重命名副本,就是这样!。我想这也应该适用于 linux,并且在制作项目文件夹的副本时,它是由正确的所有者创建的。

更改顶级目录的所有者修复了它。

运行 Laravel 在本地 Ubuntu LAMP 堆栈上,我的设置包括命令

sudo chown -R www-data /var/www/dirname

但是 www-data 拥有目录名,git 给出了上述错误。要修复它,我只需要更改顶级目录名的所有者,以及 .git 目录:

sudo chown myUserName /var/www/dirname

sudo chown -R myUserName /var/www/dirname/.git

除了已接受的答案外,对于出现 "错误:参数个数错误,应为 2" Windows,请使用双引号在提供目录参数时而不是单引号。

例如:

git config --global --add safe.directory "D:/Source/Repos/SampleProject"

sudo chown -R [用户名]:[组目录]

真的很适合我 (macbook air m1)

这真是令人沮丧。

添加到 gitconfig 是可行的,但谁愿意在每个目录中都这样做?!疯狂!

对我来说,答案是:

---> 不要使用 sudo!

在很多情况下,使用 sudo 并没有坏处,如果您在用户可以触摸的事物和需要更多访问权限的事物之间移动,这可能会成为一种习惯。

如果我的用户创建了一个存储库,然后我使用了“sudo git...”,我得到了错误。我在别名中也有“sudo git...”部分,所以我什至都在使用它并不明显。

@Huber Thomas for Windows I had to use Powershell/CMD since I had a bunch of files in an scm folder I'd moved from one location to another. The TAKEOWN 命令一起处理得很好(如果有点慢)。

  1. 以你自己的身份打开CMD(不需要是管理员)
  2. 导航到 repo 文件夹(如果有多个,则导航到父文件夹)
  3. 运行 takeown /f . /r /d Y

这将递归处理当前文件夹中的所有文件夹,并将所有权设置为登录用户(大概是您)。