为什么Git无法识别我的本地代码库?

5

我刚刚重回一个我已经使用 Git 管理大约 6 个月的项目,看到了这个:

$ cd /d/DEVELOP/BlenderAe # My repo root
$ git status
fatal: not a git repository (or any of the parent directories): .git

这绝对是正确的路径,为什么git无法识别我的本地克隆?

我最后的操作是:

  • 创建本地分支
  • 在本地分支上工作(是否切换到本地分支导致了问题?)……
  • 保存但未推送到远程(我再也不会错过这一步了!噢呜!)。

git文件夹的内容如下:

$ cd /d/DEVELOP/BlenderAe # My repo root
$ ls .git
ORIG_HEAD  objects/  refs/

我有当前的代码(已经备份,不在git中)。我该如何重新连接?同时也要与我的Github远程仓库连接吗?


修复了ORIG_HEAD后,我看到:

$ git status
Not currently on any branch.
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    (old_file1).py
        ...all the older files that were previously renamed/deleted are listed here for deletion.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        Current_file1.py
        ...all the current files are listed here as untracked.

1
我的猜测(也可能是最常见的原因):你认为你在正确的目录中,但由于某种原因你并不在。你能否在git shell中发布pwdgit status的输出(包括shell提示符),以及资源管理器中文件夹的截图? - Joachim Sauer
pwd - /d/DEVELOP/BlenderAe git status - ...MINGW64 /d/DEVELOP/BlenderAe $ git status fatal: not a git repository (or any of the parent directories): .gitpwd - /d/DEVELOP/BlenderAe git status - ...MINGW64 /d/DEVELOP/BlenderAe $ git status 致命错误:不是一个 git 仓库(或任何父目录):.git - Dan
1
请直接展示,而不是描述,例如“我也可以在项目文件夹中看到隐藏的.git文件夹” - 例如编辑问题以显示ls .git; git status。请不要通过评论回答信息请求。 - AD7six
我的当前计划是 - 删除本地文件夹并重新克隆以获取最新推送的代码(几天前的)。用备份的最新文件替换旧文件并提交,然后推送... 这样会引起任何问题吗? - Dan
2
我的当前计划是,你当然可以做到这一点。在我看来,利用这种情况作为学习经验是值得的——一旦你有信心从任何类型的“git灾难”中恢复过来,下一次就不会成为问题了。 - AD7six
显示剩余2条评论
1个回答

6

.git/HEAD 文件丢失

ls .git 命令显示 ORIG_HEAD objects/ refs/

这是不完整的,与以下内容进行比较:

$ git init
$ tree .git
.git
├── HEAD
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-merge-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

8 directories, 16 files

Git正在查找的文件缺失,用于检测git repo的文件是HEAD
$ mv .git/HEAD .git/ORIG_HEAD
$ git status
fatal: not a git repository (or any of the parent directories): .git

恢复ORIG_HEAD

ORIG_HEAD的存在表明Git留下了在执行破坏性操作时, 为了从中恢复(或者可能是看到下一个问题):

$ mv .git/ORIG_HEAD .git/HEAD 
$ git status
On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

从头开始恢复

如果缺少HEAD文件且没有ORIG_HEAD文件——只要这是唯一的问题,仍然可恢复。 HEAD文件是纯文本格式,指示当前检出的分支

通常,HEAD文件是对您当前所在分支的符号引用

例如:

$ cat .git/HEAD
ref: refs/heads/main

使用该内容创建.git/HEAD文件(将main替换为任何有效的分支名称)将允许对git仓库进行操作,如果git仓库的其他内容(.git/objects.git/refs文件夹内容)仍然存在。

@AD7six 你能相信又出了问题吗!今天早上一上来就遇到同样的错误!现在 ls .git 甚至没有显示 HEAD 或 ORIG_HEAD?有什么东西正在干扰我的系统。objects/ packed-refs refs/ - Dan
我给答案添加了一个关于那方面的部分,但你真的需要弄清楚文件是如何被删除的——这不会是git在做的:)。经常将代码推送到远程仓库可以确保不会丢失任何工作内容(因为即使本地数据全部丢失,你依然可以再次克隆代码)。 - AD7six
@Dan 如果你的目录与云服务同步,那么“系统出现问题”是一个典型的症状。对于Git仓库来说,这样做是绝对不可取的。 - j6t
@j6t @AD7six 我可能找到了答案!...我的杀毒软件(bitdefender)在过去阻止了与像gitcdn.linkgitcdn.xyz这样的未知网站的连接。我们有一些与家人共享的笔记本电脑,所以我认为其他笔记本电脑中的一个被感染了。结果是最近uBlock Origin缓存GitHub连接的一个Cloudflare问题(我已经安装了它)https://www.reddit.com/r/antivirus/comments/m936ew/bitdefender_and_gitcdn/gs1yaxt?utm_source=share&utm_medium=web2x&context=3 我认为GitHub桌面版可能一直在尝试连接并遇到了问题。 - Dan
简而言之,Bitdefender防火墙阻止了大量与git相关的连接,因此我猜测它会干扰我的git设置...但我还不确定。 - Dan
显示剩余6条评论

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