【问题标题】:Push from local copy to remote shows up as changes从本地副本推送到远程显示为更改
【发布时间】:2013-05-19 04:11:28
【问题描述】:

我在生产中的现有未版本化源树上设置了一个存储库 (git init)(不要告诉我)。 在初始导入提交后,我在我的开发机器上克隆了 repo 并开始编辑。

在第一次提交/推送之后,我的本地副本上的一切似乎都很正常,但在 prod 服务器上 git pull 总是说“已经是最新的”。并且更改显示为本地修改“否定”。

为了澄清我的否定含义:假设除了编辑之外,我在本地副本上添加了一个文件 (myfile) 并提交/推送它。 我将在服务器上看到的是:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#       deleted: myfile

还有一系列的:

#       modified: other_file

这反映了我刚刚提交的文件,但我的更改已“还原”。 git log 中的历史似乎是线性且一致的。

这是服务器上 .git/config 的内容:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = user@host:repo
[branch "master"]
    remote = origin
    merge = refs/heads/master

在我的本地副本上它是相同的加号:

ignorecase = true
precomposeunicode = false

在 [核心] 部分。

  • 开发机器git版本1.8.1.1
  • prod machine git version 1.5.6.5(我知道,它很旧,但我现在无法更新)

可能与跟踪有关吗? 我现在很困惑,更糟的是,似乎我是整个互联网上唯一遇到类似情况的人。

【问题讨论】:

  • 为了在实践中获取服务器上的更改,我需要将每个修改的文件重置为 HEAD 并从上次提交中检出(提交历史记录正确且一致)。我注意到的另一件事(但我不能说它是否正常)是当我从生产服务器中提取时,git 会询问我 ssh 用户密码,就好像要远程获取更改一样。他们不是已经在服务器上了吗?

标签: git push pull git-remote


【解决方案1】:

您正在推动非裸回购。你不应该那样做。阅读远程跟踪分支是什么,以及 git pushgit fetch 做什么。您正在更改服务器上的结帐分支指向的提交而不更新工作副本(这是推送到非裸仓库的效果)。

所以现在服务器上的git status 注意到工作目录与HEAD 不同。它假定唯一合乎逻辑的事情:您必须对工作目录进行了更改。这就是git status 所报告的内容。这个问题有两种解决方案:

  • 不要推送到生产服务器存储库。我的个人建议。在其他地方建立一个裸仓库并推到那里。将其作为远程添加到生产服务器存储库。当您要部署时,通过 ssh 进入服务器并拉取。这也将修订控制与部署分开。

  • 在服务器上设置一个挂钩,在推送时进行结帐。您可以找到有关该方法的更多信息in the GitFAQ

【讨论】:

  • 感谢您对发生的事情的清晰解释,这肯定会奏效
猜你喜欢
  • 2013-08-31
  • 2013-02-24
  • 1970-01-01
  • 2020-04-21
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2013-02-21
相关资源
最近更新 更多