过去几天,我一直在尝试在我的服务器上设置 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