git 无法拉取或合并代码Auto packing the repository in background for optimum performance. See “git help gc“ fo

今天在在自己分支更新完代码后提交到远程仓库 然后切换到master分支 准备合并提交的分支代码时 发现无法合并最新分支代码 提示 git Auto packing the repository in background for optimum performance. See “git help gc” for manu…

查资料,原来是自己本地一些 “悬空对象”太多(git删除分支或者清空stash的时候,这些其实还没有真正删除,成为悬空对象,我们可以使用merge命令可以从中恢复一些文件),话不多说,先上解决方法吧~!

解决方法:
1.输入命令:git fsck --lost-found,可以看到好多“dangling commit”
2.清空他们:git gc --prune=now,完成

原理解析:

Git的底层并没有采用 CVS、SVN 底层所采用的那套增量式文件系统,而是采用一套自行维护的存储文件系统。当文件变动发生提交时,该文件系统存储的不是文件的差异信息,而是文件快照,即整个文件内容,并保存指向快照的索引。这种做法,提高 Git 分支的使用效率;但也容易导致代码仓库中内容重复程度过高,从而仓库体积过大。当遇到这种情况时,或者需要将仓库推送到远程主机时,就需要Git中的gc(garbage collect)功能,也就是垃圾回收功能。

大体来说,当运行 “git gc” 命令时,Git会收集所有松散对象并将它们存入 packfile,合并这些 packfile 进一个大的 packfile,然后将不被任何 commit 引用并且已存在一段时间 (数月) 的对象删除。 此外,Git还会将所有引用 (references) 并入一个单独文件。

就细节而言,Git做了这几件事:

pack_refs 过程
reflog expire 过程
repack 过程
prune 过程
rerere 过程

pack_refs 过程相当于执行"git pack-refs --all --prune",它会将G I T D I R / r e f s 目 录 下 的 所 有 h e a d s 和 t a g s 打 包 成 一 个 文 件 并 保 存 为 GIT_DIR/refs目录下的所有heads和tags打包成一个文件并保存为GIT 
D
​    
 IR/refs目录下的所有heads和tags打包成一个文件并保存为GIT_DIR/packed-refs下。

reflog expire 过程相当于执行"git reflog expire --all",它会将删除所有超过期限而且没有被refs涉及的reflog条目。

repack 过程相当于执行"git repack -d -l",一般情况下还会包括"-A"选项,它会将所有未被包含在一个pack的松散对象连结成一个pack,也会将现有的pack重新组织为一个新的更有效率的pack,并删除冗余的pack(如果她们中存在不可达的松散对象,会先把这些对象释放出来)。

prune 过程相当于执行"git prune --expire",他会删除所有过期的、不可达的且未被打包的松散对象。

rerere 过程相当于执行"git rerere gc",这种情形下似乎没什么用。
 

你可能感兴趣的:(git,github)