致命:不安全的存储库(“/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,我必须执行以下操作:
- 右键单击发生错误的 git 存储库文件夹
- Select安全选项卡,然后选择“高级”(左图:按“Erweitert”)
- 检查新打开的顶部区域的所有者属性(右图:“Besitzer”)window并进行调整(右图:按“Ändern”),这一定是你的作品Windows 账户
- 按确定并等待权限设置,然后 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 命令一起处理得很好(如果有点慢)。
- 以你自己的身份打开CMD(不需要是管理员)
- 导航到 repo 文件夹(如果有多个,则导航到父文件夹)
- 运行
takeown /f . /r /d Y
这将递归处理当前文件夹中的所有文件夹,并将所有权设置为登录用户(大概是您)。
我发现来自 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,我必须执行以下操作:
- 右键单击发生错误的 git 存储库文件夹
- Select安全选项卡,然后选择“高级”(左图:按“Erweitert”)
- 检查新打开的顶部区域的所有者属性(右图:“Besitzer”)window并进行调整(右图:按“Ändern”),这一定是你的作品Windows 账户
- 按确定并等待权限设置,然后 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
- 以你自己的身份打开CMD(不需要是管理员)
- 导航到 repo 文件夹(如果有多个,则导航到父文件夹)
- 运行
takeown /f . /r /d Y
这将递归处理当前文件夹中的所有文件夹,并将所有权设置为登录用户(大概是您)。