3 回答
TA贡献1851条经验 获得超5个赞
Git并没有真正按照您的想法存储历史记录。它基于祖先链在运行时计算历史记录。如果您的祖先缺少斑点,树木或提交,那么您可能无法完全恢复历史记录。
从备份还原丢失的对象
您可以尝试的第一件事是从备份中还原丢失的项目。例如,查看是否有保存为的提交备份.git/objects/98/4c11abfc9c2839b386f29c574d9e03383fa589。如果是这样,您可以将其还原。
如果提交已经被打包,并且为了存储库手术的目的将其返回到一个松散的对象,您可能还想研究git-verify-pack和git-unpack-objects。
手术切除
如果您无法从备份中替换丢失的项目,则可以删除丢失的历史记录。例如,您可以检查历史记录或reflog来查找984c11abfc9c2839b386f29c574d9e03383fa589的祖先。如果发现一个完好无损,则:
将您的Git工作目录复制到某个地方的临时目录中。
对未损坏的提交进行硬重置。
将当前文件复制回Git工作树,但请确保不要将.git文件夹复制回去!
提交当前的工作树,并尽最大努力将其视为所有丢失的历史记录的压缩提交。
如果有效,您当然会失去介入的历史。在这一点上,如果您有可用的历史记录日志,那么最好修剪一下历史记录并重新引用所有无法到达的提交和对象。
完全还原和重新初始化
如果您的存储库仍然损坏,那么希望您有一个未损坏的备份或克隆,可以从中还原。如果不是,但是您当前的工作目录包含有效文件,那么您始终可以重新初始化Git。例如:
rm -rf .git
git init
git add .
git commit -m 'Re-initialize repository without old history.'
这太剧烈了,但是如果您的存储库历史记录确实不可恢复,那么这可能是您唯一的选择。YMMV。
TA贡献1829条经验 获得超9个赞
在尝试本页上描述的任何修补程序之前,我建议您制作一份您的仓库,仅在此副本上进行操作。然后,如果可以修复,最后将其与原始文件进行比较,以确保在修复过程中不会丢失任何文件。
对我有用的另一个替代方法是使用以下命令将git head和index重置为其以前的状态:
git reset --keep
您也可以通过打开Git GUI并选择每个“分段的更改”,然后单击“取消分段”来手动执行相同的操作。一切就绪后,您现在应该可以压缩数据库,检查数据库并提交。
我还尝试了以下命令,但它们对我不起作用,但它们可能对您有用,具体取决于您遇到的问题:
git reset --mixed
git fsck --full
git gc --auto
git prune --expire now
git reflog --all
最后,为避免此同步问题损坏您的git索引(DropBox,SpiderOak或任何其他云磁盘可能会发生这种情况),您可以执行以下操作:
.git通过使用:将文件夹转换为单个“捆绑” git文件git bundle create my_repo.git --all,则它应该与以前一样工作,但是由于所有内容都在单个文件中,因此您再也不必担心同步会损坏git repo。
禁用瞬时同步:SpiderOak允许您将检查更改的时间表设置为“自动”(这意味着它可以尽快通过OS通知来监视文件更改)。这很糟糕,因为它会在您进行更改后立即开始上传更改,然后下载更改,因此它可能会删除您刚才所做的最新更改。解决此问题的解决方案是将更改监视延迟设置为5分钟或更长时间。这也解决了即时保存笔记应用程序(例如Notepad ++)的问题。
- 3 回答
- 0 关注
- 2439 浏览
添加回答
举报