gpt4 book ai didi

从新克隆的存储库到分支的 Git checkout 导致该分支中的未暂存更改

转载 作者:太空狗 更新时间:2023-10-29 13:45:34 25 4
gpt4 key购买 nike

我有一个奇怪的 git 问题。在 checkout 其中一个分支(被远程跟踪)后,我立即在该分支中获得修改和未暂存的更改。我已经再次克隆存储库以验证问题仍然存在。

我正在使用 Windows 和 gitblit 作为 Git 服务器。

您知道为什么会发生这种情况吗?

git status的输出如下:

$ git status
# On branch RSD-5393
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: apis.releng/cquery/apis.RSD-4780.cquery
# modified: apis.releng/cquery/apis.RSD-4782.cquery
# modified: apis.releng/cquery/apis.RSD-4786.cquery
# modified: apis.releng/cquery/apis.RSD-4799.cquery
# modified: apis.releng/cquery/apis.RSD-4812.cquery
# modified: apis.releng/cquery/apis.RSD-4815.cquery
# modified: apis.releng/cquery/apis.RSD-4821.cquery
# modified: apis.releng/cquery/apis.RSD-4823.cquery
# modified: apis.releng/cquery/apis.RSD-4826.cquery
# modified: apis.releng/cquery/apis.RSD-4827.cquery
# modified: apis.releng/cquery/apis.RSD-4828.cquery
# modified: apis.releng/cquery/apis.RSD-4829.cquery
# modified: apis.releng/cquery/apis.RSD-4831.cquery
# modified: apis.releng/cquery/apis.RSD-4846.cquery
# modified: apis.releng/cquery/apis.RSD-4861.cquery
# modified: apis.releng/cquery/apis.RSD-4862.cquery
# modified: apis.releng/cquery/apis.RSD-4863.cquery
# modified: apis.releng/cquery/apis.RSD-4864.cquery
# modified: apis.releng/cquery/apis.RSD-4865.cquery
# modified: apis.releng/cquery/apis.RSD-4866.cquery
# ....
no changes added to commit (use "git add" and/or "git commit -a")

.git 配置:

[core]
autocrlf = true

.gitattributes 在存储库中:

# Set the default behaviour, in case people don't have core.autocrlf set.
* text=auto

最佳答案

发生这种情况的原因有多种。

  1. 您启用了 core.autocrlf 设置
  2. 你有一个 .gitattributes 文件,它有一个 smudgetext 过滤器

一些背景

autocrlf 试图解决跨平台开发的换行困难,但往往导致的问题多于解决的问题。
将文件添加到存储库时,它将 Windows 样式的行尾 (\r\n) 转换为 unix 样式的行尾 (\n)。在 Windows 机器上工作时,它会在 checkout 文件时将它们转换回 Windows 样式的行结尾。

虽然总体思路还不错,但它可能会导致严重的问题,尤其是当它在二进制文件上运行时。所以大多数时候自己处理行尾是一个明智的选择。

可以看看this question有关 autocrlf 的更多信息。

当使用 .gitattributes 文件时,smudge 过滤器可能会在 checkout 时修改您的文件。或者,text 属性可用于启用 autocrlf,即使您的 .gitconfig 禁用了它。


可能的解决方案

针对您的情况,一个可能的解决方案是全局禁用 autocrlf (git config --global core.autocrlf false) 并删除 * text=auto 来自 .gitattributes 文件的行。
您应该继续提交 .gitattributes 文件并将其推送到远程。

与其他所有提交一样,您必须自己确保更改在您希望的所有分支上可用。它们不会在整个存储库中神奇地可用。

在那之后,克隆应该会产生一个干净的工作目录。


最后的说明

通常 git 应该忽略 autocrlfed 文件以避免像您当前遇到的那样困惑的状态输出,但这似乎并不总是有效。避免 autocrlf 的另一个原因。

关于从新克隆的存储库到分支的 Git checkout 导致该分支中的未暂存更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25742928/

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