【问题标题】:git noob struggling to push development machine changes to remote production servergit noob 努力将开发机器的更改推送到远程生产服务器
【发布时间】:2011-05-22 16:35:09
【问题描述】:

我是 git 新手。在可预见的未来,我将成为该项目的唯一开发人员,所以我现在并不担心成为 git 专家。我只想将我的更改推送到生产服务器。

开发机有雪豹os。我安装了 git。使用 git init,添加和提交。

远程生产服务器有 ubuntu 10。我安装了 git 并使用了 git init。

然后“ssh://me@domain.com:00000/path_to_project_root/.git master:master”

得到以下错误:

"拒绝更新签出的分支:refs/heads/master。默认情况下,在非裸仓库中更新当前分支是被拒绝的,因为它会使索引和工作树与你推送的不一致,并且会需要 'git reset --hard' 以将工作树与 HEAD 匹配。您可以在远程存储库中设置 'receive.denyCurrentBranch' 配置变量 t 'ignore' 或 'warn' 以允许将其推送到当前分支;但是,这是不推荐,除非您安排更新其工作树以匹配您以其他方式推送的内容。要压制此消息并仍保持默认行为,请将“receive.denyCurrentBranch”配置变量设置为“拒绝”... [远程拒绝] master -> master(当前已签出分支)"

感谢任何帮助。

【问题讨论】:

标签: git


【解决方案1】:

这个错误在 Stack Overflow 上经常被问到,如果你理解所使用的术语,你需要知道的一切都会在错误消息中描述。在有关您问题的 cmets 中,我已链接到处理相同错误的其他几个问题,但无论如何我都会在此处添加一个快速摘要。

在 git 中基本上有两种类型的存储库 - 裸存储库和非裸存储库。当您需要处理代码时,您几乎总是使用非裸存储库,它在顶层具有:

  • .git 目录(包含项目的所有历史记录)
  • 顶级目录中的所有其他内容,通常是您正在处理的所有源代码

后者是“工作树”。

裸存储库本身就像.git 目录。这意味着,例如,裸存储库永远不会有本地更改,并且您不能在其中进行任何可能产生冲突的合并。

如果您尝试推送到当前在非裸存储库中签出的分支,则 git 有问题。如果它没有触及工作树,而是更新了分支,来自git status 的结果会突然看起来非常混乱——从分支中添加到新提交中的任何文件都将在git status 中显示为deleted 和您的本地更改和新提交引入的更改将全部混淆。如果 git 只是更新您的工作树,它可能会覆盖您在那里所做的本地更改。

通常建议您只推送到裸存储库。但是,有多种方法可以解决这个问题 - 例如,git FAQ 中的以下答案建议了一对:

在这种情况下,由于您希望推送到此存储库以部署您的代码,您可以尝试the hook linked to there,这使得推送到非裸存储库比使用@987654328 丢弃本地更改的钩子更安全@ 或类似名称。

【讨论】:

  • 谢谢。我得到它。很好的解释。我从不对远程服务器进行任何更改。也许我不应该在远程目录上运行“git init”?所以现在我需要弄清楚如何使远程服务器上的存储库成为一个裸存储库。
  • @Jay:当您登录到远程存储库时,您可以使用git clone --bare [path-to-non-bare-repository] 克隆它,然后在本地更新 origin 指向的 URL,以便它引用裸版本。
  • 您所有的帮助项目都值得点 :=]。好的...试过了,我得到的错误是“git clone --bare ~/public_html/domain_bare Initialized empty Git repository in /home/jay/public_html/domain/domain_bare.git/ fatal: failed to open '/home/ jay/public_html/domain_bare/objects':没有这样的文件或目录”在远程域目录上,我做了一个 'git init'。我想我还有其他事情要做吗?
  • 试图在远程服务器上执行 git init --bare 并得到“致命:内存不足? mmap 失败:没有这样的设备'...呃。
  • git clone --bare <path> 中的路径应该是现有的非裸存储库。如果你想创建一个全新的裸存储库,你可以这样做:mkdir whatever.git 然后cd whatever.git 最后git init --bare 顺便说一句,在 cmets 中正确回答更多问题很尴尬 - 如果你有,最好发布一个新问题其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2017-02-15
相关资源
最近更新 更多