从文件"is not a GIT packfile"恢复 Git 存储库



我不知道这台电脑出了什么问题,但我把它关掉了,半小时后我启动它,做git status -uno,它告诉我其中一个子模块"不是"什么。然后我意识到.git/submodules目录是空的。然后我从其他地方复制这些,git status -uno给了我一堆不相关的变化(一个。txt文件突然变成了一个目录?)。然后我试试git pull,它给了我大量的

error: file .git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack is not a GIT packfile
warning: packfile .git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack cannot be accessed

…但是拉力完成了。现在我仍然有不相关的状态变化,但然后我尝试git fsck --full,我得到:

$ git fsck --full
Checking object directories: 100% (256/256), done.
error: file .git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack is not a GIT packfile
fatal: packfile .git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack cannot be accessed

我是否有办法恢复这个仓库,使目前未检查的文件仍然存在?(我有一些日志,我仍然需要,但不应该签入,在更大的范围内)。我本来希望git pull能恢复它,但显然它没有……


编辑,发现这些包文件在同一repo的另一个本地副本上,但现在发生了:

cp -av /second/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38* /first/myrepo/.git/objects/pack/
‘/second/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.idx’ -> ‘/first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.idx’
cp: cannot create regular file ‘/first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.idx’: Permission denied
‘/second/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack’ -> ‘/first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack’
cp: cannot create regular file ‘/first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack’: Permission denied

但是为什么我的权限被拒绝,我是这些文件的所有者?

$ ls -la /first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38*
-r--r--r-- 1 MYUSER MYUSER    214656 Aug 18 11:05 /first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.idx
-r--r--r-- 1 MYUSER MYUSER 111503621 Aug 18 11:05 /first/myrepo/.git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.pack

仅仅拥有rrr权限不应该有什么不同,对吗?

我会在其他地方对存储库进行新的克隆,然后将工作文件复制到新的克隆中。通过这种方式,您可以在新的repo上编写未检查的更改并提交它。我会跳过。git和其他特定于repo的文件

好的,这就是我所做的-在上面那个奇怪的。pack文件副本之后,我做了:

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (15506/15506), done.
dangling blob 35603bdc2deb1bbe87014c0fa7564f2ff077d2e8
dangling blob a2e54f6f31b87bbbe16a630cb4a938f597f07da1
dangling blob 60a6b39cd196dcd09e7b2246f3f2d9d2b0c12716
dangling blob 5a667c801bc4386b6c86c98f61f82df0399da3ca
dangling blob 16b0e85eaf256a4f0a2aeb7532929077fef92737
dangling blob 827a7209620a031935539e1a70ddb005edc52bfb

…这意味着它通过得很好,但git status -uno仍然显示太多"更改未提交…",所以我做了@TimBiegeleisen建议的:

git reset --hard HEAD~2
git status -uno      # now only minimal "Changes not staged for commit"
git pull             # went back to current HEAD
git fsck --full      # same as above
git status -uno      # same as above

…事实上,git reset没有丢失我未跟踪的日志文件,这很好。所以我猜,回购现在大部分都恢复了-谢谢!

最新更新