【CICID】GitHub-Actions语法
[TOC]
【CICID】GitHub-Actions语法
1 场景
当我们开发过程中,经常需要提交代码,打包,部署新代码到对应的环境,整个过程都是人工手动操作,占据开发人员大量时间,并且很繁琐容易出错。所以需要借助一些CI/CD工具让这整个流程自动化,节约生命。
一般公司都有自己的CICD工具或平台,但如何搭建一个属于自己的一套CICD工作流呢?
常见的CI/CD工具有Jenkins、GitLab、GitHub Actions等,各有优缺点,自行百度吧~
考虑代码都在GitHub托管,也不用额外购买服务器,最终选定GitHub Actions方式
附:推荐参考
- 如果公司已有完整的代码托管平台,希望尽量少改动已有的工作流程,选 Jenkins
- 如果是公司使用+新项目,选GitLab,自带代码托管和CICD
- 如果是个人项目,希望可以使用免费资源,选Github Actions
- 如果是个人项目+有自己服务器,也可以选GitLab
2 CI/CD
2.1 什么是CI/CD
CI/CD 属于DevOps,代表持续集成、持续部署
CI/CD自动化上将新代码从提交到生产,配置基础设施所需的大部分或全部手动人工干预流程
借助CI/CD,开发人员可以对代码进行更改,然后自动测试并推出,以进行持续部署
以实现停机时间最小化,代码发布速度更快
2.2 持续集成(CI)
持续集成是在提交或合并代码时,自动测试每个更改,并自动启动构建。可以大大减少开发和运维人员的重复工作,可以在软件开发生命周期的更早阶段更轻松的发现并修复错误和安全问题。
2.3 持续部署(CD)
持续交付是一种软件开发实践,一般与持续集成结合使用,以自动化基础设置供应和应用程序发布过程。
一旦代码作为 CI 流程的一部分进行了测试和构建,持续交付将在最后阶段接管,以确保可以随时部署并将部署所需要的环境打包在一起。
通过持续交付,可以随时将构建的软件部署到生产环境。可以手动触发部署,也可以进行自动化部署。
3 介绍
GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台,可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。
3.1 优点
GitHub直接托管代码
Actions直接依赖于Github,不需额外安装任何东西
集成部署常用依赖库
支持Docker
不需要额外购买服务器搭建服务(重点!)
4 工作流常用语法
官网文档:https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions
工作流文件使用 YAML 语法,并且必须具有 .yml 或 .yaml 文件扩展名。
4.1 name : 工作流名称
name: 这是工作流名称
4.2 on : 触发工作流时机
on. .types
定义将触发工作流运行的事件活动类型
# 代码push 或者 fork等时触发 on:# 当向分支进行git push时触发该工作流push:branches:- "main"# 当向分支合并分支时触发该工作流pull_request:branches:- "main"- 事件类型:https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows
on.<push|pull_request>.<branches|tags>
定义事件筛选器,可让你更好地控制工作流的运行时间,可以指定分支和分支版本
name: MYCI on:push:branches:- masteron.<push|pull_request>.paths
使用
push和pull_request事件时,指定文件路径生效- 指定路径
on:push:paths:- '**.js'排除路径
on:push:paths-ignore:- 'docs/**'
on.schedule
定义触发事件,使用 cron
on:schedule:# 每天 5:30 和 17:30 UTC 触发工作流程- cron: '30 5,17 * * *'# 每周一至周四 5:30- cron: '30 5 * * 1,3'- cron: '30 5 * * 2,4'
4.3 jobs : 作业
工作流运行由一个或多个 jobs 组成,默认情况下并行运行。
jobs.
使用
jobs.<job_id>为作业提供唯一标识符,是一个字符串jobs:my_first_job:name: My first jobmy_second_job:name: My second jobjobs. .name
设置作业名称
jobs. .needs
此作业之前必须成功完成的所有作业
要求成功的依赖项作业
按顺序执行 job1 -> job2 -> job3
jobs:job1:job2:# 依赖job1完成needs: job1job3:# 依赖job1和job2完成needs: [job1, job2]无论是否成功,都要执行
always()按顺序执行 job1 -> job2 -> job3 ,但job3 无论是否成功,都会执行
jobs:job1:job2:needs: job1job3:if: ${{ always() }}needs: [job1, job2]jobs. .runs_on
定义要运行环境
- 指定操作系统
runs-on: ubuntu-latest公共免费GitHub托管的标准运行器

jobs. .steps
作业包含一系列任务,称为
steps步骤,步骤可以运行命令、运行设置任务,每个步骤在运行器环境中以其自己的进程运行,且可以访问工作区和文件系统,步骤之间不会保留环境变量的更改。jobs. .steps[*].uses
选择要作为作业中步骤的一部分运行的操作,
jobs:my-jobname:steps:# checkout出v1版本代码- uses: actions/checkout@v1
jobs. .timeout-minutes
工作执行超时时间,超过则取消,默认 360分钟(6小时)
jobs. .strategy
作业使用的矩阵策略,根据定义数组的笛卡尔积,创建作业
jobs:example_matrix:strategy:matrix:version: [10, 12]os: [ubuntu-latest, windows-latest]根据上述矩阵,按顺序创建作业
{version: 10, os: ubuntu-latest}{version: 10, os: windows-latest}{version: 12, os: ubuntu-latest}{version: 12, os: windows-latest}
jobs. .container
注意:如果工作流使用 Docker 容器操作、作业容器或服务容器,则必须使用 Linux 运行器:
* 如果您要使用 GitHub 托管的运行器,则必须使用 Ubuntu 运行器。* 如果您要使用自托管运行器,则必须使用 Linux 机器作为运行器,并且必须安装 Docker。用于运行作业中尚未指定容器的任何步骤的容器
在容器中运行作业
name: CI on:push:branches: [ main ] jobs:container-test-job:# 运行的外部环境runs-on: ubuntu-latest# 环境下运行的容器(Docker定义)container:# 容器中使用镜像image: node:18# 容器中定义环境env:NODE_ENV: development# 容器中定义端口ports:- 80# 容器中定义映射位置volumes:- my_docker_volume:/volume_mountoptions: --cpus 1steps:- name: Check for dockerenv filerun: (ls /.dockerenv && echo Found dockerenv) || (echo No dockerenv)只指定容器映像时,可以忽略
image关键词jobs:container-test-job:runs-on: ubuntu-latestcontainer: node:18
jobs. .services
注意:如果工作流使用 Docker 容器操作、作业容器或服务容器,则必须使用 Linux 运行器:
如果您要使用 GitHub 托管的运行器,则必须使用 Ubuntu 运行器。
如果您要使用自托管运行器,则必须使用 Linux 机器作为运行器,并且必须安装 Docker。
多个服务编排
services:# 1. nginx服务nginx:image: nginx# ngxin 80 映射 docker 8080端口 ports:- 8080:80# 2. redis服务redis:image: redis# ngxin 6379 映射 docker 6379 ports:- 6379/tcp
单个事件
# 代码push on: push多个事件
# 代码push 或者 fork on:[push,fork]指定分支触发
name: MYCI on:push:branches:- master
时机类型:https://docs.github.com/zh/actions/using-workflows/events-that-trigger-workflows
5 环境变量
Github action 定义变量很多方式,很容易搞混,记录下常用方式
口诀:
普通使用
$xxx,命令行或字符串拼接使用
${xxx},遇到
uses则用${{xxxx}}使用别人写好的Action,要用两个花括号
5.1 自定义变量
5.1.1 在env中定义变量
定义变量
jobs:build:runs-on: ubuntu-latestenv:# 端口号Port: 8080# 云服务地址Host_IP: ${{secrets.REMOTE_SERVER01_IP}} # 云服务密码Host_PWD: ${{secrets.REMOTE_SERVER01_PWD}}# 账号Host_Role: root# 路径Host_Dir: "/cicd"
变量取值
- 普通使用,
$xxx
# 测试环境变量
- name: Use variable from environmentrun: |echo "端口号:$Port"echo "服务器地址: $Host_IP"
- 有命令行或拼接使用,
${xxxx}
# 上传新的docker镜像
- name: upload new docker image and start-up scriptrun:sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}
当使用外部
uses时,${{env.xxx}}run里面也要用${{env.xxx}}
# 加载tar文件,加载docker镜像
- name: Load new docker imageuses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run:docker load -i ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar
5.1.2 Run通过写入到github变量
在run里面定义了变量,需要给后面step使用,一定要写入github环境中echo "key=$xxx" >> "$GITHUB_ENV"
定义
steps:# 定义环境变量- name: Define environment variablesrun: |# 定义全局变量PROJECT_NAME=$(basename $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')FILE_NAME=${PROJECT_NAME}-backendVERSION=0.1# 写入环境中echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"echo "FILE_NAME=$FILE_NAME" >> "$GITHUB_ENV"echo "VERSION=$VERSION" >> "$GITHUB_ENV"
取值
普通使用,
$xxx# 测试环境变量 - name: Use variable from environmentrun: |echo "项目名称 (从环境变量): $PROJECT_NAME"echo "文件名称 (从环境变量): $FILE_NAME"echo "项目版本 (从环境变量): $VERSION"有命令行或拼接使用,
${xxxx}# 构建镜像 - name: Build docker imagerun: |docker build -t ${FILE_NAME}:${VERSION} . # 构建docker镜像,命令最后的点代表Dockerfile所在目录当使用外部
uses时,${{env.xxx}}# 删除旧的docker镜像压缩包 - name: Delete old docker taruses: matheusvanzan/sshpass-action@v2with:host: ${{env.Host_IP}}user: ${{env.Host_Role}}pass: ${{env.Host_PWD}}run: |echo "Attempting to delete ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar"rm -rf ${{env.Host_Dir}}/${{env.FILE_NAME}}.tar
5.2 默认环境变量
地址:
https://docs.github.com/zh/codespaces/developing-in-a-codespace/default-environment-variables-for-your-codespace#list-of-default-environment-variables
| 环境变量 | 说明 |
|---|---|
CODESPACE_NAME | 代码空间的名称 例如,octocat-literate-space-parakeet-mld5 |
CODESPACES | 在代码空间中始终为 true |
GIT_COMMITTER_EMAIL | 未来 git 提交的“作者”字段的电子邮件。 |
GIT_COMMITTER_NAME | 未来 git 提交的“提交者”字段的名称。 |
GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN | 返回 GitHub Codespaces 转发端口的域。 例如 app.github.dev。 |
GITHUB_API_URL | 返回 API URL。 例如 https://api.github.com。 |
GITHUB_GRAPHQL_URL | 返回 GraphQL API URL。 例如 https://api.github.com/graphql。 |
GITHUB_REPOSITORY | 所有者和仓库名称。 例如,octocat/Hello-World。 |
GITHUB_SERVER_URL | 返回 GitHub 服务器的 URL。 例如,https://github.com。 |
GITHUB_TOKEN | 代表代码空间中用户的签名身份验证令牌。 您可以使用它对 GitHub API 进行经过身份验证的调用。 有关详细信息,请参阅“GitHub Codespaces 中的安全性”。 |
GITHUB_USER | 启动代码空间的用户的名称。 例如,octocat。 |
使用方式
项目名称:
${GITHUB_REPOSITORY}分支名称:
${GITHUB_REF##*/}refs/heads/main->mainrefs/tags/v1.0.0->v1.0.0
示例
- name: Print Environmentrun: | echo $GITHUB_REPOSITORY # 仓库全名echo ${GITHUB_REF##*/}
6 常用示例
定义环境变量
- name: Define environment variablesrun: |# 定义全局变量# 当前项目名(小写)PROJECT_NAME=$(basename $GITHUB_REPOSITORY | tr '[:upper:]' '[:lower:]')# 文件名FILE_NAME=${PROJECT_NAME}-backend# 常量VERSION=0.1# 写入环境中echo "PROJECT_NAME=$PROJECT_NAME" >> "$GITHUB_ENV"echo "FILE_NAME=$FILE_NAME" >> "$GITHUB_ENV"echo "VERSION=$VERSION" >> "$GITHUB_ENV"拉取代码
# 拉取最新代码 - name: Pull latest codeuses: actions/checkout@v3 # 使用官方的checkout action,用于将仓库中的最新代码检查并拉取到工作目录中连接远程服务器操作
# 连接远程服务器操作 - name: SSH Commondsuses: matheusvanzan/sshpass-action@v2with:host: "远程主机IP"user: rootpass: "远程主机密码"run: |# 命令行pwdls
传输文件
# 上传新的docker镜像 - name: upload new docker image and start-up scriptrun:# sshpass -p 远程服务器密码 scp -r -o StrictHostKeyChecking=no 当前文件 账号@远程服务器地址:目标目录sshpass -p ${Host_PWD} scp -r -o StrictHostKeyChecking=no ./${FILE_NAME}.tar ${Host_Role}@${Host_IP}:${Host_Dir}
7 参考资料
【CICD】github新功能actions全方位讲解!!
https://www.bilibili.com/video/BV1RE411R7Uy/?spm_id_from=333.337.search-card.all.click&vd_source=1d31e698afb74bb3222db3bb76f9b408
GitHub文档-Actions
https://docs.github.com/zh/actions/learn-github-actions/understanding-github-actions
GitHub Actions 的工作流语法
https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions
Github Actions 的一份不完全指南
https://ucaskernel.com/d/822-github-actions
遇到问题
run 报错: bash: -c: line 1: syntax error: unexpected end of file
如下图所示:
- name: xxxxwith:run: | echo "只有一条命令会报错"
原因:run后面的
|: 运行执行多个命令,但一条命令时会报错解决方法:
# 单条命令,去掉run后面的 `|` - name: xxxxwith:run: echo "只有一条命令会报错"# 多条命令 - name: xxxxwith:run: | echo "只有一条命令会报错"echo "两条命令就不会报语法错误"
相关文章:
【CICID】GitHub-Actions语法
[TOC] 【CICID】GitHub-Actions语法 1 场景 当我们开发过程中,经常需要提交代码,打包,部署新代码到对应的环境,整个过程都是人工手动操作,占据开发人员大量时间,并且很繁琐容易出错。所以需要借助一些…...
Ionic 创建 APP
Ionic 创建 APP Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动和网页应用程序。它结合了 Angular、React 或 Vue 的强大功能,以及 Capacitor 或 Cordova 的原生功能,使得开发者可以轻松地创建跨平台的应用程序。本篇文章将指导您如何使用 Ionic 创建一个基本的…...
【数学代码】幂
Hello!大家好,我是学霸小羊,今天来讲讲幂。 求几个相同因数的积的运算,叫做乘方,乘方的结果叫做幂。 a^n,读作 “ a的n次方 ” 或 “ a的n次方幂”,a叫做底数,n叫做指数。 对于底数、指数和幂…...
os.system() 函数
os.system() 是 Python 标准库 os 模块中的一个函数,用于在子终端中运行系统命令。它可以在 Python 脚本中调用外部命令或程序。具体来说,它通过执行命令字符串并返回执行状态来实现这一点。下面是对 os.system() 函数的详细解释: import os…...
Spring Boot中的RESTful API详细介绍及使用
在Spring Boot中,RESTful API的实现通过控制器类中的方法和特定的注解来完成。每个注解对应不同的HTTP请求方法,并通过处理请求参数和返回响应来实现不同的操作。 下面将详细解释RESTful API中的各个方面,包括GetMapping, PostMapping, PutMa…...
nlp学习笔记
目录 很多入门例子 bert chinese 很多入门例子 https://github.com/lansinuote/Huggingface_Toturials bert chinese import torch import torch.nn as nn from transformers import AutoTokenizer, AutoModel, BertModel, TFBertModel, BertTokenizer# youpath = D:/bert-…...
使用python获取内存信息
#!/usr/bin/python # -*- coding:utf-8 -*- psutil模块是一个跨平台的获取进程和系统应用情况(CPU,内存,磁盘,网络,传感器)的库。 该模块用于系统监控、限制进程资源和运行进程的管理等方面。 内存信息&am…...
外包公司泛滥,这些常识你应该提前知道?
今年大环境确实很不好 很多985,211的应届生都在网上大吐苦水,很多大龄离职大厂的技术人也好,业务人也好,都纷纷转向短视频平台做起了自媒体。而找工作的人普遍发现,某最火的招聘平台几乎都被外包公司刷屏了。大大小小的外包公司如…...
Linux下的抓包工具使用介绍
应用层 传输层 网络层 数据链路层 物理层 1)tcpdump(传输/网络层) tcpdump -i eth0 tcpdump -i eth0 -vnn -v:显示包含有TTL,TOS值等等更详细的信息 -n:不要做IP解析为主机名 -nn:…...
centos环境上:k8s 简单安装教程
本次演示安装3节点k8s环境,无需多言,直接上操作步骤: 1、环境准备 k8s部署前,首先需要准备好环境,除了1.4 步骤,其他步骤在所有(3个)节点上都要执行: 1.1 关闭防火墙 s…...
短视频矩阵系统/源码搭建---拆解热门视频功能开发上线
短视频矩阵系统/源码搭建 一、短视频矩阵系统源码开发需要用到以下技术: 1.前端技术:HTML、CSS、JavaScript、Vue.js等前端框架。 2.后端技术:Java、Python、PHP等后端语言及相关框架,如Spring Boot、Django、Laravel等。 3.移…...
手机和模拟器的 Frida 环境配置
目录 一、配置 JDK 和 android 环境 二、连接设备和查看权限 1、连接设备 2、查看手机权限 三、手机配置 Frida 1、frida-server下载 2、验证 四、模拟器配置 Frida 1、下载模拟器并调节成手机版: 2、连接并查看架构 3、配置并开启 x86 的 frida-serve…...
力扣1385.两个数组间的距离值
力扣1385.两个数组间的距离值 二分判断答案是否正确 class Solution {public:int findTheDistanceValue(vector<int>& arr1, vector<int>& arr2, int d) {ranges::sort(arr2);ranges::sort(arr1);int m arr2.size();auto check [&](int low,int h…...
[C++] 小游戏 斗破苍穹 2.11.6 版本 zty出品
大家好,今天zty带来的是斗破苍穹的 2.11.6 版本,这个版本主要更新了:1、背包 2、将退出游戏改到了设置里面 3、如果不逃跑不会停止战斗。废话不多说, 先赞后看 养成习惯 code #include<stdio.h> #include<iostrea…...
认识与学习JSP
JSP核心技术 什么是JSP JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。JSP实际上就是Servlet JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm…...
MySql 各种 join
MySql 定义了很多join的方式,接下来我们用一个例子来讲解。 用到的表 本文用到了两个表s1,s2: 内外连接 测试 1 1 1.select * from s1 inner join s2 on(s1.id s2.id);: -------- | id | id | -------- | 3 | 3 | | 4 | 4 | --------2…...
【Android面试八股文】Android中操作多线程的方式有哪些?
文章目录 1. 使用 `Thread` 和 `Runnable`2. `AsyncTask`3. `Handler` 和 `Looper`4. `HandlerThread`5. `ThreadPoolExecutor`6. `IntentService`7. `RxJava`8. `Coroutine`(协程)9. `WorkManager`在Android开发中,有多种方式可以进行多线程操作。以下是主要的几种方式: 1…...
语义分割和目标检测的关系
目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 (1)物体的位置 (2)物体的分类 从数据格式来说 (1)语义分割的数据格式 (2)目标检测的数据格式 1.语义分…...
SpringBoot 大文件基于md5实现分片上传、断点续传、秒传
SpringBoot 大文件基于md5实现分片上传、断点续传、秒传 SpringBoot 大文件基于md5实现分片上传、断点续传、秒传前言1. 基本概念1.1 分片上传1.2 断点续传1.3 秒传1.4 分片上传的实现 2. 分片上传前端实现2.1 什么是WebUploader?功能特点接口说明事件APIHook 机制 …...
数据资产治理与数据质量提升:构建完善的数据治理体系,确保数据资产的高质量与准确性
一、引言 随着信息技术的迅猛发展,数据已经成为企业和社会发展的重要资产。然而,数据资产的有效治理与数据质量的提升,是企业实现数字化转型、提升竞争力的关键。本文旨在探讨数据资产治理与数据质量提升的重要性,并提出构建完善…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...
