git pull和伪造本地变化

时间:2015-08-26 02:35:41

标签: git

我已经多次询问过这种情况,通常会有不同的警告。就我而言,我正在使用git将更改从我的本地开发框部署到git服务器,最后通过cron作业将更改提取到Web服务器上。

我的工作流程是:

  1. 提交对本地工作副本的更改
  2. 将更改推送到上游服务器(创建为裸仓库,我将本地推送到)
  3. 网络服务器上的
  4. git pull -Xingore-space-at-eol
  5. 理论上这应该有用。但是,git拒绝这样做,似乎随意选择它认为有本地更改的文件。

    Updating bb48022..7eff182
    error: Your local changes to the following files would be overwritten by merge:
            app/models/User.php
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    在Web服务器上,我执行了一些文件更改 - 我添加了未跟踪的文件,并且我更改了权限。 git配置了filemode = false,我还使用了git config --global core.autocrlf true来启用自动CRLF处理。

    git diff --ignore-space-at-eol不会返回任何差异。 git status显示了大约12个“未提交的更改”,但这些文件并未真正以我能注意到的任何方式进行更改。

    我尝试用

    隐藏错误的本地更改
    git stash
    git pull
    git stash pop
    

    但它在git pull

    时失败了

    此时我唯一的工作选项是吹走整个克隆文件夹,每次都进行新的克隆,然后应用权限更改并执行composer install

    我必须在这里错过一个基本概念。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

找到解决方案。该问题与终端管理有关。一个开发框是Windows,另一个是Linux,git服务器是Linux,Web服务器是Linux。

在Windows框中,我发现git statusgit diff显示了未提交的相同修改文件。我的.gitattributes文件中包含* text=auto,这意味着git会尝试自动确定用于所有文本的正确行尾。出于某种原因,我的Windows框有一个不同步的索引。遵循此处的指示 - http://git-scm.com/docs/gitattributes#_end_of_line_conversion - 我执行了以下操作:

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

我在Web服务器上执行了一个新的克隆并进行了一些测试更改。它似乎现在正常工作。