【问题标题】:Git Push Not Updating the CodeGit Push 不更新代码
【发布时间】:2017-06-01 14:59:56
【问题描述】:

我正在更新远程存储库中的代码。 由于某种原因,更新没有得到反映。

git push origin master
Enter passphrase for key '*********/.ssh/id_rsa':
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 421 bytes | 0 bytes/s, done.
Total 5 (delta 4), reused 0 (delta 0)
remote: Already on 'master'
remote: M       app/Http/routes.php
To ssh://ec2-**-***-***-***.us-west-2.compute.amazonaws.com/***************
   ce2cc5b..8149f07  master -> master

我不明白“远程:M”是什么。

请指导我。我必须尽快发布。

【问题讨论】:

  • git remote -vv 的输出是什么?
  • 我得到 git remote -vv 的以下输出:- origin ssh://root@ec2---- .us-west-2.compute.amazonaws.com/***************(获取)来源 ssh://root@ec2 ----.us-west-2.compute.amazonaws.com/************ ***(推)
  • 我猜remote: M 表示已修改但不确定。你有没有查看 git history 看它是否干净。什么给了git status?你一个人在这个存储库上工作吗?
  • Git 状态是“没有提交,工作树干净”。目前我一个人在这个存储库上工作..
  • 我猜你已经这样做了,但试试 git pull。 “反映”是什么意思?你期待什么?

标签: git bash ssh amazon-ec2


【解决方案1】:

首先,请记住,当您运行 git push(或者,就此而言,git fetch)时,有 两个 Git 和 两个 存储库参与该过程.一个是“你的”Git 和“你的”存储库,另一个是远程的 Git 和它的存储库。 (远程的存储库也可能属于您,但只需将其视为某个其他人,通过 Internet 电话接收您的请求。)

在它们前面打印没有 remote: 的消息来自你的 Git。 remote: 打印在前面的消息来自遥控器。他们不是直接来自另一个 Git ——这两个 Git 设置了他们的网络电话安排,以便他们直接交谈并知道彼此在说什么——而是来自一个由 其他 Git。当其他 Git 运行诸如钩子之类的东西并且这些东西打印他们的自己的消息时,他们的 Git 将这些消息复制到您的 Git,对您的 Git 说:“我“而你的 Git 会:它打印 remote: <em>whatever</em> 以表明 other Git 运行的东西打印了 whatever


现在,在您的设置中,您在另一个系统上设置了一个部署脚本。那是您的接收后挂钩。接收后挂钩可以做很多事情,但您的特定脚本旨在作为一种部署机制。你把这个脚本的大致内容放在a comment 中,但是这里的格式更好(cmets 不支持格式):

#!/bin/sh
GIT_WORK_TREE=********************
export GIT_WORK_TREE
git checkout master

这个脚本的作用是使原本裸露的存储库——远程的那个——充当非裸露的存储库:工作树是通过GIT_WORK_TREE 指定的。 (顺便说一句,您可以将其设为单行脚本,而不是三行:git --work-tree=... checkout master。不过,除了个人喜好之外,没有特别的理由更喜欢这两种形式。)

git checkout 有时会打印什么样的输出?好吧,让我们试试吧:

$ git checkout master
M       wt-status.c
Already on 'master'

您在输出中看到了什么,前缀为 remote:

remote: Already on 'master'
remote: M       app/Http/routes.php

结论:这几乎肯定来自您的部署脚本运行的git checkout 命令。 (这两行的顺序发生了变化,但它们仍然来自git checkout。)

git checkout 何时打印这种消息? Git的documentation在这里有点单薄,但是:

要准备使用 &lt;branch&gt;,请通过更新 索引和工作树中的文件,并通过将 HEAD 指向 分支。 对工作树中文件的本地修改 保留,以便他们可以提交到&lt;branch&gt;

因此,当索引和/或工作树被修改时会发生这种情况,但可以保留这些本地修改。 (详见Git - checkout another branch when there are uncommitted changes on the current branch。)

这意味着您的(远程)工作树相对于 HEAD 提交对文件 app/Http/routes.php 进行了一些更改。1 当您使用 Git 推送到远程,使用其 Git,远程 Git 运行部署脚本。当部署脚本使用您未公开的工作树以及裸存储库使其像非裸存储库一样运行时,另一个 Git 的部署脚本运行 git checkoutthat checkout “保留 ( local-to-remote-work-tree) 修改”,但会打印 M 行。

由于保留的修改是on远程,处理它的唯一方法是转到远程(例如,ssh in),以便您可以在当地工作。然后,调查为什么要修改该工作树:谁进行了此更改?为什么?它有什么作用?它应该在存储库中吗?是否应该以其他方式完成?是否需要修改部署脚本? 无法为您回答任何这些问题; 必须决定如何让这一切顺利进行。


1稍微复杂的图片,这些可能在遥控器的索引中。该索引实际上是裸存储库的 索引,因为git --work-tree=... checkout 使用存储库中的(单个)索引,即使该索引反映了工作树。但是,有可能更改仅在远程的部署工作树中。

【讨论】:

  • 谢谢先生....终于我知道了从哪里远程:M 正在显示。我刚刚将接收后的钩子修改为“GIT_WORK_TREE=******************** export GIT_WORK_TREE git checkout -f master”,现在一切正常......非常感谢大家...
猜你喜欢
  • 1970-01-01
  • 2011-06-24
  • 2019-08-19
  • 2015-07-03
  • 2018-03-04
  • 1970-01-01
  • 2012-06-10
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多