为什么git clone 仓库代码会有几十MB

为什么 git clone 仓库代码会有几十MB

前言

碰到 Jenkins流水线 报错,发现是拉取代码超时,很是郁闷。经过查询,发现拉取的git仓库代码至少20MB,因而本文聊聊下载仓库代码过于庞大的原因 ,以及如何在 Jenkinsfile 中配置代码的拉取操作

 > git fetch --tags --force --progress -- https://gitee.com/charlesdengng/qlcgl.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 
 ERROR: Timeout after 10 minutes
 ERROR: Error fetching remote repo 'origin'

1. 出错的原因

image.png

  1. 服务器拉取代码的网速低,只有30kb左右
  2. 拉取的代码仓库过大。因为图中Receiving objects 达到了69%,拉取了19.6MiB。而我的代码仓库并不会有 19MB 之多,通过https下载代码仓库只有大概 4MB 左右

2. 解决思路

  1. 提升网速

网速差是偶发现象,因为我会使用插件Workspace Cleanup 在 pipeline 执行后清空workspace。每次拉取代码都是重新克隆仓库,但偶尔会出现拉取时间超时。

  1. 减少拉取代码的大小,所以我们要知道为什么我们拉取的代码这么大

3. 先了解 git clone

3.1 git clone 做了什么

$ git clone https://github.com/libgit2/libgit2

这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。

git 默认会进行全部克隆

这个.git文件夹包含我们所有commit的历史版本,以及所有分支。假如仓库有master和dev两个分支,且每个分支占有4MB空间,那么我们下载的仓库代码大小为8MB。再加上 commit 的历史版本,所以下载的仓库代码不止8MB。

3.2 如何更快克隆仓库

gi官方文档 已经给出了答案。添加参数 depth <深度>

  • 创建一个历史记录被截断为指定提交次数的“浅”克隆。暗含 --single-branch 选项,除非给出 --no-single-branch 来获取所有分支顶端附近的历史记录。

推荐 git clone XXXXXX.git --depth 1。表示拉取一个默认的主分支,并且只有最新的commit信息。

注意 正常开发不需要浅克隆,因为你需要协同开发,历史commit和其他分支还是需要拉取到本地的

4 正确配置 Jenkinsfile 中的代码拉取

Jenkins使用git fetch 拉取代码到.git文件夹下,然后通过 git checkout 检出最新代码。

我们只要在 chenckout步骤中增加 CloneOption 扩展即可。


environment {
        // git仓库地址
        git_web_url = 'https://gitee.com/charlesdengng/qlcgl.git'
        //连接git所需的凭据
        git_auth = 'xxxxx-xxxx-xxxx-xxxx-xxxxxxx'
        //部署到服务器的具体位置
        baseDir = '/home/devops/WebApp'
    }

stages {
    // 拉取代码
    stage('拉取代码') {
        steps {
            // 拉取前端代码到/var/lib/jenkins/workspace/${JOB_NAME}/web下(具体可在Jenkins web页面的配置页里看见)
            checkout([$class: 'GitSCM', branches: [[name: '*/master']], 
                    extensions: [
                        // 指定 git 仓库检出后所放位置,相对于/var/lib/jenkins/workspace/${JOB_NAME}
                        [$class: 'RelativeTargetDirectory', relativeTargetDir: 'web'], 
                        //克隆选项
                        [$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]
                     ], 
                     //告诉git拉取的仓库地址以及对应仓库的凭据
                    userRemoteConfigs: [[credentialsId: "${env.git_auth}" , url: "${env.git_web_url}" ]]])
                   }
          }
     }

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYNLoLZC' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片