为什么我仍然有“已更改但未更新”的文件?

25 浏览
0 Comments

为什么我仍然有“已更改但未更新”的文件?

我有一个文件被修改了:

$ git status
# 在分支 master 上
# 已修改但未更新:
#   (使用 "git add ..." 来更新将要提交的内容)
#   (使用 "git checkout -- ..." 来丢弃工作目录中的更改)
#
#       修改:   vw_static.vcxproj
#

即使执行了 git reset --hardgit checkout -- vw_static.vcxproj

git diff 看起来只显示了空格(特别是行结束符)的差异。

$ git config core.autocrlf
input
$ git config --global core.autocrlf
input

在这个项目中没有 .git/info/attributes (全局也没有 .gitattributes)。

我不关心该项目中的行尾符,也不想改变这个特定文件(尤其是提交任何与它相关的内容)。

我只想让 git status 报告树是未修改的。

我该如何做到这一点?

0
0 Comments

为什么我仍然有“已更改但未更新”的文件?

这个问题出现的原因是,在Linux上设置了core.autocrlf true,导致文件以DOS行尾结束符提交到仓库,而实际上应该是Unix行尾结束符。使用core.autocrlf已被弃用,应该使用.gitattributes文件以正确的方式将所有文件规范化为使用Unix行尾,在仓库中使用.gitattributes文件并使用*.vcxproj text eol=crlf来在所有平台上检出这些带有DOS行尾结束符的文件。然而,由于我不拥有该仓库,也无法引入重大更改,所以只需要解决方法即可。

解决方法为执行以下命令:

git config --global core.autocrlf true && git checkout -- vowpalwabbit/vw_static.vcxproj && git status

实际上,为了实现平台无关性,需要执行以下命令:

for opt in true false input; do
  git config --global core.autocrlf $opt
  for f in $(git ls-files -m); do
    git checkout -- $f
  done
  git status
done

这个解决方法可能不理想,但至少能解决问题。

0
0 Comments

为什么我仍然有“已更改但未更新”的文件?

出现这个问题的原因可能是文件在提交到仓库时使用了DOS换行符。尝试以下解决方法:

1. 设置git配置以禁用自动转换换行符功能:

git config core.autocrlf false

2. 删除.git/index文件:

rm .git/index

3. 强制重置仓库:

git reset --hard

4. 将文件转换为Unix换行符格式:

dos2unix file1

dos2unix file2

5. 使用Unix换行符重新提交这些文件:

git commit -m "Ensure files are committed with Unix line endings" file1 file2

6. 将git配置恢复为默认值:

git config core.autocrlf input

7. 检查仓库的状态:

git status

如果文件已经以DOS换行符形式提交到仓库中,那么上述方法是唯一的解决办法,因为这些文件已经被“损坏”了,需要进行修复。

0