Git Push不更新代码

时间:2017-01-17 13:55:34

标签: git bash ssh amazon-ec2

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

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

我没有得到“remote:M”的内容。

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

1 个答案:

答案 0 :(得分:2)

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

你的 Git之前打印 remote:的消息来自。在前面打印 remote:的消息来自遥控器。他们不是直接来自其他Git-两个Gits设置了他们的互联网电话安排,以便他们直接交谈并知道彼此在说什么 - 而是从运行其他Git。当另一个Git运行的东西 - 比如钩子 - 那些东西打印他们的自己的消息时,他们的 Git将这些消息复制到你的Git,对你的Git说:“我不知道这意味着什么,但钩子印了这个,这可能很重要,那你为什么不把它展示给整个过程中唯一可用的人,即做git push的人?”而且你的Git会这样做:它会打印remote: whatever来表示其他 Git的内容已打印 whatever

现在,在您的设置中,您在另一个系统上设置了部署脚本。那是你的收件后挂钩。后接收挂钩可以做很多事情,但是您的特定脚本用作部署机制。您将此脚本的大致内容放在a comment中,但此处格式更好(注释不支持格式化):

#!/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在这里有点薄,但是:

  

要准备处理<branch>,请通过更新来切换到它    索引和工作树中的文件,并指向HEAD    分支。 对工作树中文件的本地修改    保留,以便他们可以提交到<branch>

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

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

由于保存的修改是 on 遥控器,处理它的唯一方法是转到遥控器(例如,ssh in)以便你可以在那里工作。然后,调查为什么修改工作树:谁做了这个改变?为什么?它有什么作用?它应该在存储库中吗?它应该以其他方式完成吗?您需要修改部署脚本吗? 无法为您回答任何问题; 必须决定如何使这一切工作。

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