我已经设置了我的git工作结构如下(感谢另一个问题中的建议git : Small project work)
/live/website
|
|
/path/to/staging (bare)
| |
| |
dev1 dev2
目前,dev1和dev2都将项目推送到/path/to/staging repo
。我在/ path / to / staging中有一个钩子,它会自动从我的/ live / website触发git pull
。这样,我就有了一份工作文件副本。
此外/path/to/staging (bare)
已使用share = 0777初始化,因此我知道共享不是问题。此外,我已将所有文件CHMODT到777并设置了棒位。
我已将/ live / website repo创建为user : root
。但是,我已将dev1中的repo创建为user : dev1
。我可以在dev1中进行更改,但是当我尝试从dev1推送repo时,这就是我面临的问题:
error: Couldn't set refs/remotes/origin/master
From /path/to/staging
! 8b4fddc2 .. e2a0b21 master -> origin/master (unable to update local ref)
To path/to/staging
8c5fddc2 .. e2a0b21 master -> master
基本上,我没有看到文件成功转移到/ live / website。我认为这个问题出现了,因为我正在执行user : dev1
代码。但是,当我浏览/live/websit
e并手动git pull
作为user : root
时,它会成功提取dev1所做的更改并更改工作文件。
如果有办法解决此问题,有人可以推荐吗?因为它超越了自动挂钩的目的......
我想做的其他事情就是陷入困境,我想改变用户:
su root
password
但是,当它执行时,我不认为我在提示符下输入密码,因为我收到的错误消息是:
hooks/post-receive: line 18: password: command not found
编辑,
此外,有人可以提出一种从推送回来的方法吗?并获得以前的文件状态?
答案 0 :(得分:1)
AFAIK你不能在命令行上输入密码。但您可以使用sudo,将允许的用户添加到/etc/sudoers ,无密码,这样您就可以将命令作为sudo -u webside-user-name 'cd /live/website && git fetch && git checkout master'
运行。
答案 1 :(得分:0)
我正在使用类似的工作流程,我甚至在实时网络服务器上都没有root访问权限,它仍然可以正常工作。这是我正在使用的脚本(它是一个post-receive钩子;我想它可能是一个更新后的钩子,但我没有测试过):
#!/bin/sh # To enable this hook, make this file executable by "chmod +x post-receive". GIT_WORK_TREE=/path/to/htdocs git checkout -f
然后你可以通过运行hooks / post-receive来测试钩子。如果它在您手动测试时有效,那么当您运行“git push”
时它应该可以正常工作