【发布时间】:2017-08-04 07:13:30
【问题描述】:
症状
我有一个奇怪的问题,我想签出一个不同的分支<branch2>,但是当我尝试时,我收到了一条消息
$ git checkout <branch2>
error: The following untracked working tree files would be overwritten by checkout:
<filename.xlsx>
Please move or remove them before you switch branches.
Aborting
但是git ls-files 将<filename.xlsx> 列为跟踪文件。
解决方法
如果我执行git checkout -f <branch2>,它可以工作,并且 Excel 文件的 <branch2> 版本存在且正确(类似地,如果我 rm <filename.xlsx> 然后结帐,我会得到正确的文件。)
回到<branch1>,我遇到了完全相同的问题(<filename.xlsx> 已被跟踪,但结帐时似乎未跟踪)。
测试/故障排除
进一步调查这似乎与 Windows/Linux 问题有关:
- 我主要在 Debian 的 VirtualBox VM 中工作,因此我在那里使用我的 git 工具和终端,并通过 VirtualBox 共享文件夹进行访问。
- 我的一些代码(包括此存储库)存在于主机系统 (Windows 10) 上,因为它是特定于平台的。
- 如果我使用适用于 Windows 的 Git,则不会出现此问题。
- 如果我克隆到 linux 文件系统,则不会出现此问题。
- 如果我从上游克隆到不同的 Windows 文件夹并从 linux 访问,我会遇到同样的问题。
- 同一存储库中具有相同文件但内容不同的其他分支再次不会遇到相同的问题(即签出按预期工作)
- 具有相同文件版本的其他提交具有相同的问题。
- 只有这两个文件版本的小型 repo 不会表现出相同的行为,因此很遗憾,没有简单的方法来创建 MCVE。
最后的想法
老实说,这是一个相对容易解决的问题,到目前为止,范围似乎仅限于 的这两个副本,但它让我很感兴趣。如果任何对 git 有更深入了解的人对如何诊断/修复此问题的根本原因有任何想法,我将不胜感激。
额外调试
这是git ls-files --debug 来自<branch1> 的结果
CodeSheet.xlsx
ctime: 1489465633:751038200
mtime: 1489465633:751038200
dev: 38 ino: 5432
uid: 0 gid: 999
size: 14752 flags: 0
这是git ls-files --debug 来自<branch2> 的结果
Codesheet.xlsx
ctime: 1489467487:720851100
mtime: 1489467487:720851100
dev: 38 ino: 5502
uid: 0 gid: 999
size: 12546 flags: 0
【问题讨论】:
-
这是令人费解,因为“未跟踪”的字面意思是“不在索引中”。我建议使用
git ls-files --debug更仔细地检查事物,并检查“不可见”的文件名字符(空格、非打印控制字符等)。 -
@torek 在那里看了一眼,弹出的主要内容是两个分支之间的大小写更改(我之前没有注意到)。这显然是原因。多谢了。至少我现在可以“修复”它。
标签: linux windows git virtualbox