2016-08-25 50 views
0

我不知道这台计算机有什么问题,但是我关了它,半小时后我启动它,做git status -uno,它告诉我一个子模块“不是”某种东西。然后我意识到.git/submodules dir是空的。然后我从其他地方复制那些,git status -uno给了我一堆无关的更改(一个.txt文件突然变成了一个目录?)。然后我尝试git pull,它给我一吨从文件中恢复Git回购“不是GIT packfile”

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应该没有区别吧?! (虽然它似乎已被复制,文件大小看起来是正确的)...

+1

你有没有工作在当地尚未承诺和推动?如果我处于这种情况,我可能会选择回滚到之前的提交,并从回购中拉出新的。 –

+0

@TimBiegeleisen - 不,我没有未提交的更改,但我确实有未跟踪的日志文件,我不想丢失。你会建议什么命令来回滚,'git checkout HEAD〜1;混帐拉'? – sdaau

+1

未跟踪的文件应该没问题(我认为...)。你可以尝试'git reset --hard HEAD〜N',其中'N'是提交的提交数量。如果您确定遥控器具有所有这些信息,请尝试此操作。如果您确定,然后及时向后跳,然后再次尝试拉。 –

回答

1

我会做其他地方的资源库的新克隆,然后复制工作文件到新的克隆。通过这种方式,您可以在新的回购库上编写未经检查的更改并可以提交。我会跳过.git和其他特定于repo的文件。

+0

感谢@Mateusz,会给你一个尝试... – sdaau

0

好吧,这是我做的事 - 在.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没有失去我的日志文件未追踪,这是很好的。所以我想,回购现在大部分已经恢复 - 谢谢大家!