为什么我仍然有“已更改但未更新”的文件?
为什么我仍然有“已更改但未更新”的文件?
我有一个文件被修改了:
$ git status # 在分支 master 上 # 已修改但未更新: # (使用 "git add..." 来更新将要提交的内容) # (使用 "git checkout -- ..." 来丢弃工作目录中的更改) # # 修改: vw_static.vcxproj #
即使执行了 git reset --hard
和 git checkout -- vw_static.vcxproj
。
git diff
看起来只显示了空格(特别是行结束符)的差异。
$ git config core.autocrlf input $ git config --global core.autocrlf input
在这个项目中没有 .git/info/attributes
(全局也没有 .gitattributes
)。
我不关心该项目中的行尾符,也不想改变这个特定文件(尤其是提交任何与它相关的内容)。
我只想让 git status
报告树是未修改的。
我该如何做到这一点?
为什么我仍然有“已更改但未更新”的文件?
这个问题出现的原因是,在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
这个解决方法可能不理想,但至少能解决问题。
为什么我仍然有“已更改但未更新”的文件?
出现这个问题的原因可能是文件在提交到仓库时使用了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换行符形式提交到仓库中,那么上述方法是唯一的解决办法,因为这些文件已经被“损坏”了,需要进行修复。