Git克隆导致文件被删除和未跟踪

26

我对Git还不熟悉。

我刚在Windows(10)上安装了Git(2.9.3),然后打开了git-bash并执行了git clone <remoteURL>。这样就创建了一个包含整个远程仓库拷贝的新文件夹,这很好。但是接着我运行了git status,发现有大量的deleted文件(我想这些都是拷贝过来的文件),已经准备commit提交,并且仓库文件夹下的三个主文件夹是untracked的。但实际上这些被deleted的文件仍存在于我的硬盘中!

我相当确定我的git状态应该是干净的。到底出了什么问题?

这篇关于被删除的文件的帖子没有帮助(我没有使用checkout),这篇关于未跟踪的文件的帖子也没有帮助(我没有使用Mac OS)。


出了些大问题。 - Schwern
我使用TortoiseHg来访问GIT存储库(它有一个插件) - 运行得很好,GUI比命令行更友好。如果你想尝试我的建议(你不会后悔的) - 我可以在聊天中提供进一步的帮助。 - IVO GELOV
git reset 怎么样? - Shravan40
你改变了根目录吗?重命名/删除/更改层次结构了吗? - ItayB
10个回答

37

我正在检索一个路径非常长的大型项目。我忘记设置 Git 以使用长路径:

git config --global core.longpaths true

之后,克隆进行得很好,状态干净。


即使在git版本2.23.0.windows.1Windows 10上也无法正常工作。 - mukund
这适用于 git 版本 2.36.1.windows.1 和 Windows 11 Pro。 - vili
它“部分地”起作用了。然后我运行了“git restore”。一些文件仍然被删除或修改了,但比起之前好多了,因为我只需要读取它们。 - undefined

11

看起来你可能加载了一个空的索引。通常情况下,这是使用命令 git read-tree --empty 发生的,但对于 Git 的新用户来说,这并不是通常会使用或知道的命令。

也许克隆过程中出了些问题。不过修复起来应该不难,只需运行:

git reset

索引应恢复为最新提交的内容。


重置让我找对了方法:只有剩下的已删除文件实际上不存在于我的驱动器上,它们可能具有最长的路径。请参见我的答案。 - pHneutre
1
git reset 对我有帮助。谢谢! - TheTechGuy
git reset 对我也起作用了,很多关于这个问题的答案都是关于不同的行尾符号,但显然与此无关! - Cerveser

7

这个问题不仅困扰着“新手git”的OP,也让我这个有经验的git老手大为惊恐。 :-)

感谢其他答案给出的提示,我发现这是由于git偶然不能在当前文件系统和/或操作系统上检出一些文件名包含不支持字符的文件所导致的。例如,当我克隆github wiki存储库时,一些wiki页面恰好在其文件名中包含:字符,它们可以在我的Linux机器上正常克隆,但(事后看来)显然不适用于我的Windows机器。

了解根本原因使我们能够自信地决定如何/是否解决此问题:

  • 我们可以通过将那些有问题的文件名重命名为更短和/或只包含常规字母来在资源库中修复它。
  • 或者,技术上说,我们根本不需要修复它。如果那些有问题的文件名在它们的目标平台上没有问题,并且我们正在处理此资源库的其他内容,我们可以像往常一样继续工作;我们只需记住不要将这些缺失的文件作为删除提交即可。(已经有过这种经历,别在家里尝试。)

1
一个 'git reset' 告诉我有一个带有空格和冒号 : 的文件。删除该文件解决了问题。这应该是被接受的答案。 - Robyc
我应该补充说明,在Linux和Mac上我使用了同样的代码库,没有出现任何问题。在Windows上(出现问题的地方)使用的git版本是2.26.0.windows.1。 - Robyc

3
如果您在Windows上遇到问题,可以检查您的文件名是否包含以下禁止使用的字符: < (小于号)
> (大于号)
: (冒号)
" (双引号)
/ (正斜杠)
\ (反斜杠)
| (竖线或管道符号)
? (问号)
* (星号)
或者文件名是以下保留词之一或其后紧跟扩展名: CON,PRN,AUX,NUL,COM1,COM2,COM3,COM4,COM5,COM6,COM7,COM8,COM9,LPT1,LPT2,LPT3,LPT4,LPT5,LPT6,LPT7,LPT8和LPT9。 更多细节请参见此处

我遇到了文件名包含“:”冒号的问题,但是我该如何解决这个问题? - Ali Fellahi
@AliFELLAHI 最简单的方法是重命名文件,这就是我所做的。 - Yaroslav Yakovlev

2

如果你发现使用longpath属性无效并且正在Windows上使用Git Bash,那么可能是因为你的文件名使用了Windows保留关键字。例如,我的文件名中包含nul,在克隆后这些文件被删除了。我花了半天时间才找到了这个原因。

解决方法很简单,只需要在其他机器/操作系统上将文件重命名,然后推送到Git仓库,并重新在Windows机器上进行克隆操作即可。


1
在我的情况下,我在Mac上的不区分大小写文件系统中克隆了repo,然而该repo包含一个名为Config的文件和一个名为config的目录,文件系统认为它们是相同的。因此,在克隆时,它显示文件Config已被删除。
解决方法是在区分大小写的文件系统上克隆repo。

0

我在Windows 10上遇到了类似的问题,我检查了其他正常运行git的Windows系统,我的git版本是2.24.xx。我安装了旧版本的git 2.16.x,问题得到了解决。你可以试一下,看看是否有效。


1
这不是一个答案,请在此处仅写答案。 - Oded BD

0

文件名中也可能包含不可见字符,在其他系统上检查一下吧 ;)


0
这对我来说很有效,只需要这个命令:
git config --global core.protectNTFS false

0

显示某些文件已修改的行为可能与行尾设置和多个客户端使用有关。每个操作系统都以自己的方式处理行尾。因此,如果您正在处理在多个操作系统中编辑的文件的存储库,则可能会看到意外结果。

以下命令将永久解决此问题

git config --global core.autocrlf input


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接