0

我没有想法,需要一些。

我正在尝试将更改从本地计算机推送到使用项目的远程服务器。

我有点使用本指南:http ://ryanflorence.com/deploying-websites-with-a-tiny-git-hook/

我像这样在本地机器上添加遥控器

$git remote add stage ssh://user@domain.com/var/www/domain.com/public_html

这个 /var/www/domain.com/public_html 是 repo 的路径

然后当我这样做

$git push stage stage 

一切似乎都有效,但更改似乎没有出现在网站上。

所以检查远程(阶段)#git status 我可以看到

$ On branch stage
$ Changes to be committed:
$   (use "git reset HEAD <file>..." to unstage)
$
$   modified:   sites/all/modules/custom/bf/bf.forms.inc
$

因此,在远程(舞台)上执行 #git reset --hard 会带来变化。

然后我添加一个接收后挂钩来自动化这个过程我的接收后文件包含

#!/bin/sh
cd ..
GIT_DIR='.git'
umask 002 && git reset --hard

但是现在当我做 $git push stage stage 时,我得到了这个结果

计数对象:24,完成。Delta 压缩最多使用 2 个线程。压缩对象:100% (16/16),完成。写入对象:100% (16/16),1.56 KiB,完成。总共 16 个(delta 10),重用了 0 个(delta 0) remote:错误:拒绝更新已签出的分支:refs/heads/stage 远程:错误:默认情况下,在非裸存储库中更新当前分支远程:错误:被拒绝,因为它会使索引和工作树不一致远程:错误:与您推送的内容,并且需要'git reset --hard'来匹配远程:错误:工作树与HEAD。远程:错误:远程:错误:您可以在远程存储库中将“receive.denyCurrentBranch”配置变量设置为远程:错误:“忽略”或“警告”以允许推入远程:错误:其当前分支;然而,除非您远程:错误:安排更新其工作树以匹配您在某个远程:错误:其他方式中推送的内容,否则不建议这样做。远程:错误:远程:错误:要压制此消息并仍保持默认行为,请将远程:错误:'receive.denyCurrentBranch' 配置变量设置为'拒绝'。到 ssh://user@domain.com/var/www/domain.com/public_html ![远程拒绝] 阶段 -> 阶段(当前已签出分支)错误:未能将一些参考推送到 'ssh://user@domain.com/var/www/domain.com/public_html' 配置变量“拒绝”。到 ssh://user@domain.com/var/www/domain.com/public_html ![远程拒绝] 阶段 -> 阶段(当前已签出分支)错误:未能将一些参考推送到 'ssh://user@domain.com/var/www/domain.com/public_html' 配置变量“拒绝”。到 ssh://user@domain.com/var/www/domain.com/public_html ![远程拒绝] 阶段 -> 阶段(当前已签出分支)错误:未能将一些参考推送到 'ssh://user@domain.com/var/www/domain.com/public_html'

我该如何纠正这个问题?我的意思是根据消息,这不是推荐的工作流程,有更好的方法吗?

4

1 回答 1

2

错误消息非常清楚地告诉您需要做什么:登录到您的服务器并运行git config receive.denyCurrentBranch ignore.

通常,设置 git 以便您可以git pull从任何存储库中访问,无论是裸存储库还是非裸存储库,但git push只会发生在裸存储库中。(“裸”存储库是没有工作目录的存储库;文件夹的内容就是.git目录的内容。)这是有道理的;如果您检查了一个分支,并且我将同一分支的新版本推送到您的机器上,那么您的工作目录会突然过时,并且您的下一次提交可能会恢复我刚刚推送的许多内容。那很糟。

In this setup, the working directory is the directory which your web server reads and which nobody commits, you actually want git to update the working directory immediately, and you have a post-update hook that does "update its work tree to match what you pushed in some other way". You can turn off the error message and go about your business.

如果您好奇,git reset --hard将清除您的本地更改并确保您的工作目录与 HEAD 相同。就像 git 中的大多数事情一样,有多种方法可以做同样的事情,你可以很容易地编写git checkout HEAD .. 不过,一个建议是:也添加一个git clean -dfgit checkout并且git reset通常不要删除您尚未添加到 git 的文件,因此如果您希望已删除的文件从您的服务器中消失,您需要专门指示 git 这样做。

希望有帮助!

于 2012-09-19T01:21:41.750 回答