这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战
前言
今天我们再来讲一讲Git操作碰到的问题,一起来看看吧。
远程仓库过大导致无法push
问题出现场景:在前两天本人发现笔记仓库过大 已经达到600M的时候,本人花了一些时间将无用的大文件删除(详见
问题5
),并且减小到了100M+,然后推送上了gitee上,但是今天push的时候突然报错仓库过大无法推送
- 问题报错截图
- 本人就产生很大的疑惑,明明我本地仓库才100+M,
.git
文件也才86M,但是远程仓库竟然达到了恐怖的1300M+(当时急于寻找解决方案,没有截图)本人推测(不确定,也找不到人问,朋友都没经历过这个情况,所以引出记录待定,如果有小伙伴知道了希望可以发在评论区或者私信我)
当时我是将多条命令一起复制进去运行,可能导致
git gc
命令没有运行到(可能性极小,但还是留下悔恨的泪水)也许本地的gc命令只是清理了本地仓库的,远程也要清理,但这个并不重要,知道了这个点后我们能进行解决了
问题解决:
GC后内存
GC详解
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",它会将GITDIR/refs目录下的所有heads和tags打包成一个文件并保存为GITDIR/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",这种情形下似乎没什么用。
所以本人推测应该是进行了
问题5
操作后还需要进行一次GC操作
8、Git GUI中文乱码问题解决方法
当我们使用Git GUI的查看代码的时候,有时候会出现中文乱码:
- 解决方案1:直接在
GIT GUI
中操作**
- 解决方案2:命令行
git config --global gui.encoding utf-8
解决方案3:直接修改配置文件
在软件的安装目录下,在
Git\mingw32\etc\gitconfig
文件末尾添加:
[gui]encoding=utf-8
9、Git 切换远程仓库地址
在公司开发中,也许会遇到公司项目地址迁移的问题(本人就遇到了) : 比如从码云gitee上将项目迁移到gitLab上,那么我们本地怎么切换远程仓库地址呢? 很简单!
切换远程仓库地址
方式一:修改远程仓库地址
git remote set-url origin URL #更换远程仓库地址,URL为新地址。一步到胃
方式二:先删除远程仓库地址,然后再添加
git remote rm origin #删除现有远程仓库 git remote add origin url #添加新远程仓库
查看远程仓库地址
没错,改完了,很简单是吧,但是你怎么确定自己是否修改成功了呢?
git remote -v #查看远程仓库的地址
截图示例
总结:还有最后一章关于Git操作总结的文章,大家有兴趣的可以继续关注!