git fetch/pull 超级慢,怎么解决

git仓库经过长时间使用后,会出现git fetch慢的问题,有些同学甚至fetch一次需要5min,这是什么原因导致的呢?又如何能解决这个问题呢?

一、git fetch耗时分析

1.1 git debug模式使用

  • GIT_TRACE for general traces,
  • GIT_TRACE_PACK_ACCESS for tracing of packfile access,
  • GIT_TRACE_PACKET for packet-level tracing for network operations,
  • GIT_TRACE_PERFORMANCE for logging the performance data,
  • GIT_TRACE_SETUP for information about discovering the repository and environment it’s interacting with,
  • GIT_MERGE_VERBOSITY for debugging recursive merge strategy (values: 0-5),
  • GIT_CURL_VERBOSE for logging all curl messages (equivalent to curl -v),
  • GIT_TRACE_SHALLOW for debugging fetching/cloning of shallow repositories.
  • true1 or 2 to write to stderr,
  • an absolute path starting with / to trace output to the specified file.

1.2 对当前git仓库进行耗时分析

在git命令前添加GIT_TRACE=2  GIT_CURL_VERBOSE=2

GIT_TRACE=2  GIT_CURL_VERBOSE=2 git fetch

 

对其中的时间节点进行分析,发现耗时较长的部分为index-pack,即为节点清点耗时较长。

19:32:36.367917 git.c:348               trace: built-in: git 'fetch'
19:32:36.406098 run-command.c:343       trace: run_command: 'git-remote-http' 
19:32:36.958254 run-command.c:343       trace: run_command: 'rev-list' 
19:32:37.090419 run-command.c:343       trace: run_command: 'fetch-pack' 
19:32:37.197130 git.c:348               trace: built-in: git 'fetch-pack' 
19:32:47.419848 run-command.c:343       trace: run_command: 'index-pack' '--stdin' '-v' '--fix-thin' '--keep=fetch-pack 11028 on shay3h004178651' '--pack_header=2,7646'
19:32:47.543202 git.c:348               trace: built-in: git 'index-pack' '--stdin' '-v' '--fix-thin' '--keep=fetch-pack 11028 on shay3h004178651' '--pack_header=2,7646'

19:32:52.087720 run-command.c:343       trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
19:32:52.203242 git.c:348               trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'

19:32:53.697196 run-command.c:343       trace: run_command: 'gc' '--auto'
19:32:53.831319 git.c:348               trace: built-in: git 'gc' '--auto'

二、解决git节点清点耗时较长的方法

2.1  出现节点清点耗时较长的原因

由于remote与本地仓库长时间运行,导致两遍的仓库节点差异较大。git 每次fetch都会比对差异节点,将remote存在而本地不存在的节点fetch到本地,因此每次清点需要耗较长时间。

2.2 解决方法一:删除本地仓库重新clone

将本地仓库所有分支和变更都commit并push后。重新clone仓库。新拉下来的仓库与remote节点完全一致。这样清点节点耗时就非常短了,能大大加快清点耗时。

2.3 解决方法二:本地仓库执行节点清理命令

节点清理压缩(需较多内存):在git所在目录执行命令:git gc --aggressive --prune=now。将本地节点清理压缩,减小差异节点清点耗时。

git gc --aggressive --prune=now

 

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: git fetchgit pull都是git版本控制系统中的命令,都可以用于从远程仓库中获取更新。它们的区别在于git fetch只是将远程仓库中的内容更新到本地,而不会自动合并到本地分支中;而git pull = git fetch + git merge,即先通过git fetch获取远程更新,再将这些更新自动合并到本地分支中。 使用git fetch可以掌握远程仓库的最新消息,但是你需要手动将这些更新合并到你的本地分支中以让你更新的文件数量得到更新。这就意味着,如果你要查找特定的提交或检查其他分支的状态,git fetch是一个不错的选择,因为它不会覆盖本地更改。 相反,git pull可以自动将最新的代码更新到本地,它相当于同时执行了git fetchgit merge命令。因此,如果你不需要查看远程仓库的更改并手动合并更新,那么使用git pull会更加方便快捷。 总的来说,git fetchgit pull都是获取远程仓库中的更新的命令,只不过git pull会自动合并到本地分支中,而git fetch则需要手动合并。具体使用哪个命令取决于你的需求以及实时情况。 ### 回答2: git fetchgit pullgit中常用的两个指令,它们可以帮助我们在本地仓库中获取远程仓库的更新内容。它们的区别在于: Git fetch会将远程仓库的最新版本下载到本地仓库的缓存区,但并不自动合并到工作目录中。这意味着你可以使用git fetch来查看远程仓库的最新版本,然后再根据自己的需要选择是否要合并到当前分支。你可以使用git merge来合并这些更新。 Git pull则将远程仓库的最新版本自动合并到你的工作目录中,它其实是git fetchgit merge这两个操作的合并。如果你想要将远程仓库中的更新同步到本地并快速合并到当前分支,则可以使用git pull。 在使用git fetchgit pull的过程中,你需要注意以下几点: 首先,你需要在执行这些指令之前先将本地的修改提交或者暂存,否则会出现冲突和数据丢失的情况。 第二,当你执行git fetch命令时,可以通过指定远程仓库的名称和分支名称,来缩小获取更新的范围,避免下载整个仓库的更新,节省时间和网络流量。 第三,当你使用git pull命令时,如果出现冲突,需要手动解决冲突后再提交。 综上所述,git fetchgit pull是获取远程仓库更新的两个常用指令,它们的区别在于是否自动合并到工作目录中。在实际操作中需要根据自己的需要选择使用哪个指令,并注意避免出现冲突和数据丢失。 ### 回答3: git fetchgit pull都是git中比较常用的命令,它们都能够从远程仓库将代码更新到本地仓库,但是它们的方式与执行结果略有不同。 首先,git fetch命令会从远程仓库拉取最新的代码,但是并不会自动将代码合并到本地仓库中。它会将代码更新到本地仓库中的远程分支中,你需要使用其他命令将这些更新合并到本地分支中。git fetch命令的一些常用选项包括: -f:强制执行fetch操作,即使本地分支与远程分支存在冲突; -p:下载所有分支及其相关的git tags; -v:输出详细的下载进度。 另一方面,git pull命令则将最新代码从远程仓库拉取到本地仓库中,并自动执行合并。一般情况下,它会首先执行git fetch,然后再自动将远程分支合并到本地分支中。git pull命令的常用选项包括: -m <msg>:使用指定的合并信息; -r:使用rebase的方式将本地变更应用到从上游分支中获取的代码之前; --no-rebase:禁用rebase并使用合并(merge)的方式将本地变更应用到从上游分支中获取的代码之前。 总的来说,git fetchgit pull都是将代码从远程仓库同步到本地仓库中的命令,它们的区别在于前者只会更新本地仓库中的远程分支,需要手动合并,而后者则会自动执行合并操作。具体使用哪一个命令,要根据实际情况进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值