0

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

在第一次提交/推送之后,我的本地副本上的一切似乎都很正常,但在产品服务器上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(我知道,它很旧,但我现在无法更新)

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

4

1 回答 1

1

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

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

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

  • 在服务器上设置一个钩子,在 push 上进行结帐。您可以在 GitFAQ中找到有关该方法的更多信息

于 2013-05-25T12:54:15.717 回答