从文件中恢复Git回购;不是GIT packfile“;

从文件中恢复Git回购;不是GIT packfile“;,git,Git,我不知道这台计算机可能出了什么问题,但我关闭了它,半小时后我启动了它,执行git status-uno,它告诉我其中一个子模块“不是”什么。然后我意识到.git/submodules目录是空的。然后我从其他地方复制这些文件,git status-uno给了我一些不相关的更改(一个.txt文件突然变成了目录?)。然后我试着拉git,它给了我很多 error: file .git/objects/pack/pack-65f501f2463a843b574db1ac1bde89b44e9acf38.p

我不知道这台计算机可能出了什么问题,但我关闭了它,半小时后我启动了它,执行
git status-uno
,它告诉我其中一个子模块“不是”什么。然后我意识到
.git/submodules
目录是空的。然后我从其他地方复制这些文件,
git status-uno
给了我一些不相关的更改(一个.txt文件突然变成了目录?)。然后我试着拉git,它给了我很多

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能恢复它,但显然它不能


编辑,在同一回购协议的另一个本地副本上找到这些打包文件,但现在发生这种情况:

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
不应该有什么区别,对吧?!(虽然它们似乎已被复制,但文件大小似乎正确)

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

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

好的,这就是我所做的-在上述.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
没有丢失我未跟踪的日志文件,这很好。所以我想,回购协议现在大部分都恢复了——谢谢大家

好的,这就是我所做的-在上述.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
没有丢失我未跟踪的日志文件,这很好。所以我想,回购协议现在大部分都恢复了——谢谢大家

您是否有任何尚未提交和推动的本地工作?如果我处于这种情况,我可能会选择回滚到较早的提交,并从回购中重新提取。@TimBiegeleisen-不,我没有未提交的更改,但我有未跟踪的日志文件,我不想丢失这些文件。您建议使用什么命令来回滚,
git checkout HEAD~1;git pull
?未跟踪的文件应该可以(我认为…)。您可以尝试
git reset--hard HEAD~N
,其中
N
是提交到nuke的次数。只有当您确定遥控器具有所有这些信息时,才可以尝试此操作。如果您确定,请及时向后跳,然后再次尝试拉。您是否有任何尚未提交和推送的本地工作?如果我处于这种情况,我可能会选择回滚到较早的提交,并从回购中重新提取。@TimBiegeleisen-不,我没有未提交的更改,但我有未跟踪的日志文件,我不想丢失这些文件。您建议使用什么命令来回滚,
git checkout HEAD~1;git pull
?未跟踪的文件应该可以(我认为…)。您可以尝试
git reset--hard HEAD~N
,其中
N
是提交到nuke的次数。只有当您确定遥控器具有所有这些信息时,才可以尝试此操作。如果你确定,那么及时向后跳,然后再次尝试拉。