推送到 Git Remote 时出现权限问题

推送到 Git Remote 时出现权限问题

过去几天,我一直在尝试在我的服务器上设置 Git Remote,以便将更改推送到我的 Web 服务器。问题是,我在执行此操作时收到以下错误:

$ git push --porcelain --progress --recurse-submodules=check live refs/heads/master:refs/heads/master
'master' pushed: d689cce..4e755fc
Delta compression using up to 4 threads.
Total 3 (delta 2), reused 0 (delta 0)
remote: error: unable to create file .gitignore (Permission denied)        
remote: error: unable to create file .gitignore~ (Permission denied)        
remote: error: unable to create file index.js (Permission denied)        
remote: error: unable to create file package.json (Permission denied)   

现在,我知道这与文件和文件夹所有权有关,并且我和/或 git 可能有或可能没有对某些文件夹的写权限。

问题是我根本不知道哪个文件夹不能写入或如何解决它。

我对从头开始设置网络服务器还很陌生,所以我做了以下事情:

我经历了如何使用 VPS 设置 Git 自动部署尝试看看如何启动并运行遥控器。这促使我创建了以下两个文件夹:/var/repo/site.git/var/www/website

在没有被告知任何有关权限的信息的情况下,我继续尝试按照要求推送到远程,但立即遇到了第一个权限障碍。

因此,我咨询了一位朋友,他建议我创建一个新组,将我的用户添加到该组中,然后让/var/repo该组拥有775读/写/执行权限。他还建议我按照建议去做这里以确保/var/www文件夹具有正确的权限;但即使如此,我仍然无法推送到远程,如上面的错误所示。

那么我该怎么做才能解决这个问题?我现在有点陷入困境了。

关于我使用的东西的一些信息:

  • 客户端操作系统:OSX Yosemite
  • 服务器操作系统:Ubuntu 15.04
  • Git 客户端:SmartGit 6.5(为方便起见)
  • 我使用 SSH 而不是 HTTPS 连接到远程

答案1

问题不在于 /var/repo 上的写访问权限 - 我相信从您复制/粘贴的错误来看,这个设置是正确的,而且可能一直都是正确的。

问题在于 /var/www 缺少写权限。

按照您链接到的说明,您设置的是一个脚本,它会自动获取您推送到服务器上的 git 存储库的文件并将其发布到 /var/www。在我看来,这是一种聪明的方法,但该脚本(位于文件 /var/repo/hooks/post-receive 中)的运行方式与推送到 git 存储库的脚本相同。该用户似乎没有写入 /var/www 的权限

假设您已经按照上一个答案中的步骤进行操作,那么这两个附加命令应该可以解决问题:

chown -R root:git-users /var/www/

chmod -R g+rw /var/www/    

答案2

由于您在评论中说过用户通过他们的 推送到 git username@server,所以您需要确保所有 git 用户都对存储库具有读写权限。

将所有用户添加到一个公共组,比如说,git-users

groupadd git-users

现在将每个 git 用户添加到组中:

usermod -a -G git-users <username>

现在,更改 git 存储库的所有权组:

chown -R root:git-users /var/repo/

现在,设置权限以使该组可以读取和写入 repo:

chmod -R g+rw /var/repo/

现在,该组的任何成员git-users都具有读写权限。

现在我们setgid只需要目录的位:

 find /var/repo/ -type d -exec chmod g+s {} \;

另外,您需要sharedRepository在远程 git 配置中启用该设置:

[core]
sharedRepository = true

相关内容