gpt4 book ai didi

git - 在 crlf 规范化后使用 stash 卡住 repo?

转载 作者:IT王子 更新时间:2023-10-29 01:04:06 24 4
gpt4 key购买 nike

我的本​​地存储库处于禁止我提交、存储、 checkout 到另一个分支甚至放弃更改的状态。所以我被困住了。

我将尽量描述我所记得的是什么步骤导致我遇到这种情况。

请坐。

不久前,在很远很远的另一台计算机上...... 另一个开发人员根据以下内容规范化了项目中的 crlf:https://help.github.com/articles/dealing-with-line-endings

同时(你知道,光速......)我在本地进行了一些更改,提交并 pull 。

当我 pull 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 从索引中删除因为它是一个适应每个本地环境的模板配置文件。

基础"template"可以改变。没什么好惊讶的。这是我的计划:

  1. 重建索引 wp-config.php
  2. stash我自己的配置更改
  3. pull origin master
  4. stash apply我的配置回来

第 3 步出错。git pull origin master还是报上面的错误,好像stash是无效的。

git statuswp-config.php更改未提交提交。藏起来后,这让我有点吃惊。

因为我 stash 了我的更改,所以我运行了 git checkout -- wp-config.php ...但没有任何效果!文件仍未暂存提交。

由于我变得疯狂,我创建了一个新分支 my-config,添加并提交了 wp-config.php进去,然后切换回master,删除wp-config.php (使用 git rm ),并 merge origin/master... 成功!

现在 master 是最新的并且是干净的,我计划在没有 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 apply , commitcheckout master给出上面的错误
  • git stash生成 stash 条目但不更改未暂存状态
  • git checkout -- <file>既不删除未暂存状态

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

真实故事。

我很想了解在 master 分支上发生了什么,然后在 my-config 分支上发生了什么,以及是什么让我陷入这种情况(我怀疑在 crlf 转换文件上使用了 stash)。

重要提示:

  • 我在 linux 上运行
  • git core.autocrlfinput
  • 我的 .gitattributes与“dealing-with-line-endings”一文中的相同
  • 我对 Git 比较陌生(使用它的第 2 天)

当我做的时候stash在 my-config 分支上它输出:

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 分支上所做的唯一提交)

最佳答案

经过一些研究,我猜想发生了以下情况。您的同事更改了导致第一次 pull 冲突的行尾。

这就是为什么你 stash 你的工作,取出东西(现在没有问题)并再次开始应用 stash 。

通过调用 git stash apply git 启动一个 recursive merge在您 stash 的更改中。

错误消息只是告诉您遇到了 merge 冲突。根据开发商的stash-documentation这可以通过 git stash drop 解决解决冲突后:

"Applying the [stash] can fail with conflicts; in this case, it is not removed from the stash list. You need to resolve the conflicts by hand and call git stash drop manually afterwards."

结论:如果行尾的配置必须在现有项目中完成,最好的做法似乎是使用 .gitattributes 来完成。在您的项目文件夹中。由于它与您的 line-ending-change-commit 一起分发,因此它将避免将您当前的工作切换到新的规范化标准的麻烦。

更改项目和 .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 .

Attention: Since the second step requires to delete the .git/index (which is branch-specific) this must be done in every single branch you'd like to keep.

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

关于git - 在 crlf 规范化后使用 stash 卡住 repo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17123998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com