4

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

我使用 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")

.gitconfig:

[core]
autocrlf = true

.gitattributes 在存储库中:

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

1 回答 1

1

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

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

一些背景

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

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

您可以查看此问题以获取有关autocrlf.

使用.gitattributes文件时,smudge过滤器可能会在结帐时修改您的文件。或者,即使您禁用该text属性,也可以使用该属性来启用它。autocrlf.gitconfig


可能的解决方案

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

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

之后,克隆应该有望产生一个干净的工作目录。


最后说明

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

于 2014-09-09T12:15:41.853 回答