在crlf规范化之后使用存储来阻止回购?

时间:2013-06-15 13:08:42

标签: git newline git-stash

我的本​​地仓库处于一种状态,禁止我提交,藏匿,结账到另一个分支,甚至放弃更改。所以我只是卡住了。

我将尽力描述在我记忆中哪些步骤让我了解这种情况。

请坐下。

不久前,在远处的另一台计算机上...... 项目中另一个开发标准化的crlf根据:https://help.github.com/articles/dealing-with-line-endings

同时(你知道,光速......)我在当地进行了一些改动,提交和拉动。

当我拉Git说:

error: Your local changes to the following files would be overwritten by merge:
    wp-config.php

wp-config.php之前已使用git update-index --assume-unchanged wp-config.php从索引中删除,因为它的模板配置文件适用于每个本地环境。

基础“模板”可以更改。没什么好惊讶的。这就是我的计划:

  1. reindex wp-config.php
  2. stash我自己的配置更改
  3. pull origin master
  4. stash apply我的配置回来了
  5. 第3步出现问题。git pull origin master仍然引发了上述错误,就像存储无效一样。

    git status表示wp-config.php的修改没有进行提交。在藏匿之后,这让我感到惊讶。

    由于我隐藏了我的更改,我跑了git checkout -- wp-config.php ...但没有任何效果!文件仍未进行提交。

    由于我生气了,我创建了一个新的分支my-config,添加并提交wp-config.php,然后切换回master,删除wp-config.php(使用git rm),合并起源/主人......成功!

    所以现在主人是最新的和干净的,我计划在没有Git帮助的情况下恢复我自己的配置(手动编辑文件)。

    由于我想知道发生了什么,我切换到my-config分支,并尝试了一个非常简单的操作:

    git stash
    git stash apply
    

    猜猜是什么? stash apply未能说:

    error: Your local changes to the following files would be overwritten by merge:
        wordpress/license.txt
        wordpress/readme.html
        ...
        (all the files that where modified by the crlf conversion)
    

    现在我被困在我的分支上(计划看到它,法语国家会理解;))因为:

    • git stash applycommitcheckout master提供上述错误
    • git stash生成一个存储条目,但不会更改未暂停状态
    • git checkout -- <file>均未删除未暂停状态

    我现在唯一能做的就是删除所有这些文件(使用操作系统rm),以便能够返回到主分支。

    真实的故事。

    我很想了解主分支上发生的事情,然后是my-config分支,以及是什么让我遇到了这种情况(我怀疑在crlf转换文件上使用存储)。

    重要说明:

    • 我在linux上运行
    • git core.autocrlfinput
    • 我的.gitattributes与“处理行结尾”一文中的内容相同
    • 我对Git比较陌生(第二天和它一起生活)

    当我在my-config分支上stash时,它输出了:

    warning: CRLF will be replaced by LF in wordpress/license.txt.
    The file will have its original line endings in your working directory.
    ... (one for each crlf converted file) ...
    Saved working directory and index state WIP on my-config: dbf65ad my config -- should not be pushed
    HEAD is now at dbf65ad my config -- should not be pushed
    

    dbf65ad是我在my-config分支上做的唯一提交)

3 个答案:

答案 0 :(得分:5)

经过一番研究后,我发现以下情况发生了。你的同事改变了造成第一次拉动冲突的线头。

这就是为什么你把你的工作藏起来,拉出东西(现在没有问题)并开始再次申请藏匿处。

通过调用git stash apply git启动隐藏更改的recursive merge

错误消息告诉您遇到合并冲突。根据开发人员的stash-documentation,解决冲突后git stash drop可以解决这个问题:

  

“应用[stash]可能会因冲突而失败;在这种情况下,它不会   从隐藏列表中删除。您需要手动解决冲突   然后手动拨打git stash drop。“

结论:如果必须在现有项目中完成行尾的配置,那么最佳做法似乎是在项目文件夹中使用.gitattributes。由于它与您的行结束更改提交​​一起分发,因此可以避免将当前工作转换为新的规范化标准。

更改项目中的行结尾&amp; .gitattributes

根据.gitattributes的开发人员文档,您可以使用以下步骤更改所有文件的行结尾(在活动分支中):

$ echo "<<filepattern>> eol=lf" >>.gitattributes
$ 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"

<<filepattern>>替换为与您的源文件匹配的模式 - 在您的情况下*.py替换python文件(在此.gitignore-description中给出了良好的模式解释)。

如果您要添加多个文件模式,则可以向.gitattributes添加多个行结尾定义。

  

注意:由于第二步需要删除.git/index(特定于分支),因此必须在您要保留的每个分支中执行此操作。

如果要处理许多分支,可以考虑编写一个简短的脚本iterating through your git branches

答案 1 :(得分:1)

重置本地模块的最佳方法是使用

git clean -f -x -d

这有效地删除了对本地模块的所有未跟踪更改,并将其重新置于'vanilla'状态。

-f清理文件。
{。1}}通常被.gitignore忽略的文件。
-x清理目录。

现在运行-d。这会将分支重置为远程状态。

git reset --hard origin/<BRANCH_NAME>此时应告诉您:

git status

如果您的实际更改被隐藏起来,那么您应该能够# On branch master nothing to commit (working directory clean) 将它们正确放回。

如果git stash apply显示的更改次数超出预期,您只需应用git stash show stash@{0}即可查看的内容。

希望这有帮助

答案 2 :(得分:0)

首先,关于GitHub帮助页面,我会认真地建议设置:

git config --global core.autocrlf false

让我们保留对.gitattributes files中明确声明的修改,而不是全局规则:keep core.autocrlf to false

其次,您可以看到git stash使用git update-index --skip-worktree观察到相同的eol修改。