惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News - Newest:
Hacker News - Newest: "LLM"
The Last Watchdog
The Last Watchdog
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
Cloudbric
Cloudbric
N
News | PayPal Newsroom
Security Archives - TechRepublic
Security Archives - TechRepublic
TaoSecurity Blog
TaoSecurity Blog
H
Hacker News: Front Page
Help Net Security
Help Net Security
S
Secure Thoughts
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
AI
AI
Hacker News: Ask HN
Hacker News: Ask HN
NISL@THU
NISL@THU
Last Week in AI
Last Week in AI
Forbes - Security
Forbes - Security
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
Scott Helme
Scott Helme
Jina AI
Jina AI
T
Threatpost
W
WeLiveSecurity
P
Palo Alto Networks Blog
F
Fortinet All Blogs
腾讯CDC
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
P
Privacy International News Feed
P
Proofpoint News Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
A
About on SuperTechFans
V
Vulnerabilities – Threatpost
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cyber Attacks, Cyber Crime and Cyber Security
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
IT之家
IT之家
美团技术团队
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
T
Threat Research - Cisco Blogs
博客园 - 司徒正美

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程 开发 Tips(5)
你不知道的 Git 使用技巧
微信公众号 · 2019-05-17 · via 陈少文的网站

1. Pages 功能

GitHub、GitLab、Bitbucket 等,都提供了免费的静态页面托管服务,称之为 Pages 。利用 Pages 服务,可以发布文档、博客等。

以 GitHub 为例,通常只需要简单几个步骤,就可以使用 Pages:

  1. 新建一个项目:[username].github.io
  2. 提交静态 html 文件
  3. 访问 [username].github.io,也可以绑定自己的域名进行访问。

如果你想要使用 Markdown 编辑文档,那么就需要借助 Jekyll、Hexo 等静态页面生成工具。

2. Git hooks

Git hooks 是 Git 仓库在特定事件被触发时,自动执行的一系列脚本。通过关联特定的事件,可以达到自定义工作流的目的。

Git 将 hooks 脚本存储在仓库的 .git/hooks 目录下。

1
2
3
4
ls .git/hooks/
applypatch-msg.sample		post-update.sample		pre-push.sample			prepare-commit-msg.sample
commit-msg.sample		pre-applypatch.sample		pre-rebase.sample		update.sample
fsmonitor-watchman.sample	pre-commit.sample		pre-receive.sample

钩子分为客户端和服务器端。客户端关联本地事件,服务器端关联服务器事件。

客户端的钩子有:

  • pre-commit,在提交信息前运行。推荐一个工具,提供了大量相关插件,pre-commit
  • prepare-commit-msg,在启动提交信息编辑器之前,默认信息被创建之后运行。
  • post-commit,在整个提交过程完成后运行。
  • applypatch-msg,可以用该脚本来确保提交信息符合格式,或直接用脚本修正格式错误。
  • pre-applypatch,在 git am 运行期间被调用。
  • post-applypatch,运行于提交产生之后,是在 git am 运行期间最后被调用的钩子。
  • pre-rebase,运行于变基之前,以非零值退出可以中止变基的过程。
  • post-rewrite,被那些会替换提交记录的命令调用。
  • post-checkout,在 git checkout 成功运行后调用。
  • post-merge,在 git merge 成功运行后调用。
  • pre-push,在 git push 运行期间, 更新了远程引用但尚未传送对象时被调用。
  • pre-auto-gc,会在垃圾回收开始之前被调用,可以用它来提醒你现在要回收垃圾了,或者依情形判断是否要中断回收。

服务器端的钩子有:

  • pre-receive,处理来自客户端的推送操作时,被调用。
  • update,为每一个准备更新的分支各运行一次。
  • post-receive,在整个过程完结以后运行,可以用来更新其他系统服务或者通知用户。

另外,通常 Git 仓库页面上,可以注册回调 URL hooks,用于触发某些事件,比如 Jenkins 的流水线。

3. CI/CD

除了上面提到的 Git hooks,还可以通过 yaml 更灵活地定义 CI/CD 流程。而你只需要理解 stage、job 等 CI/CD 概念,编写简单的 shell。

更多相关内容,可以参考 常用的一些 CI 脚本

3.1 GitHub CI

Travis CI 是一个基于云的持续集成项目,目前已经支持大部分主流语言,如:C、PHP、Ruby、Python、Nodejs、Java、Objective-C 等。

使用时,主要分成两步:

  1. 使用 GitHub 账户登陆 TravisCI
  2. 在 GitHub 仓库新增 .travis.yml 文件
1
2
3
4
5
language: node_js
node_js:
  - "7.5.0"
before_script: npm install
script: npm run dev

3.2 GitLab CI

Gitlab Runner 是 GitLab 提供的 CI 执行器。GitLab 官方提供了限时长的免费 Runner,也允许用户自助接入服务器作为项目的 Runner。

使用时,不需要借助第三方,直接在仓库中增加 .gitlab-ci.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 一些前置脚本,完成激活环境等操作
before_script:
  - source /data/runner/node/bin/activate
  - which node && node --version
  - which npm && npm --version
  - LANG="zh_CN.utf8"
  - export LC_ALL=zh_CN.UTF-8

# 编排需要执行的 stage
stages:
  - build
  - deploy

更多相关内容,可以参考 GitLab CI 配置 Runner

4. GPG 验证提交

Git 是一个分布式的版本管理系统。每个人都有一份仓库的副本,每个人都在自己的分支上开发,然后合并到主分支。这样可能会导致某些恶意提交,原因可能是某位开发者的账号被盗、服务器漏洞等。

人与人之间的信任,需要传导到仓库之间。因此,我们需要 GPG,一种信息加密、验证机制。

GitHub 上使用 GPG 主要步骤:

  1. 安装 GPG
1
brew install gnupg gnupg2
  1. 生成 GPG keys,拿到 [密钥ID]
1
gpg --full-generate-key
  1. 输出密钥
1
2
gpg --list-keys
gpg --armor --output public-key.txt --export [密钥ID]
  1. 上传 public-key 到 GitHub

在 Settings 页面,点击 SSH and GPG keys,在 GPG keys 那里,点击 New GPG key。在输入框里填入 public-key.txt 内容,保存即可。

  1. 本地 Git 配置
1
2
git config --global user.signingkey  [密钥ID]
git config --global commit.gpgsign true

配置完毕,以后提交代码时,每条提交记录都会显示一个绿色的 Verified 标签。

需要注意的是保持 git config --global user.namegit config --global user.email 与上面生成 GPG Key 时一致。

5. Git 工作流

通过 Git 对项目进行分支开发,建立的工作流程称之为 Git Flow。 Git 主要有三种工作流:

  • Git flow

长期存在两个分支:主分支 master 和 开发分支 develop。适合发布流程比较长的项目,比如 Apple App Store 应用。

  • GitHub flow

只有一个长期存在的 master 主分支。适合持续集成,更新迭代快的项目,典型的互联网项目特征。

  • GitLab flow

Git flow 和 GitHub flow 的结合体。采用上游优先的原则,master(上游)修改的代码会同步到其他分支(下游),比如 chromium 开发,不同开发商在不同分支开发,但是服务商会不定期合并 master 代码。

更多相关内容,可以参考 敏捷开发之研发流程

6. Merge/Pull Request

在采用了 Git 工作流之后,需要采用 Merge/Pull Request 的方式进行多人开发。

通常,我们会在 Merge/Pull Request 流程中做 Code Review。Merge/Pull Request 流程是保证模块正确耦合、高质量代码的关键。

另外,Merge/Pull Request 还可以关联 issues,例如: close #33,当 Merge/Pull Request 被 Merge 时,相应的 issues 就会被自动关闭。

更多相关内容,可以参考 基于 Git 的前后端开发工作流如何更好做 CodeReview

7. 使用 issues 进行项目管理

除了管理代码仓库版本,Git 中的 issues 还可以用于项目管理。

issues 指的是一项待完成的工作,可以是缺陷、功能建议、规划中的功能等。

issues 只是列出了一系列工作事项,Git 提供了 label、milestone、board 对 issues 进行多维度的管理功能。

label 主要用于对 issues 分类、过滤。

milestone 主要用于定制计划,一个 issues 只能绑定一个milestone。

board 提供的看板功能,可以直观看到工作事项、项目进度。

更多相关内容,可以参考 如何使用 python-gitlab 自动创建 GitLab Label

8. 定制 issues 或者 pull request 模板

在使用 issues 对项目进行管理时,规范化 issues 模板,让提交者尽可能准确描述问题,是十分有必要的。

Git 提供这样的模板功能。

以 GitHub 为例,在代码仓库新建目录:.github。你可以添加单个模板,也可以添加多个模板。

  • 添加单模板

.github 目录下添加 ISSUE_TEMPLATE.md 文件作为 issues 默认模版。

  • 添加多模板

在代码仓库新建目录:.github/ISSUE_TEMPLATE。该目录下可添加多个 .md 文件作为 issues 模版。

pull request 模版 和 issues 模板类似,只是文件或文件夹名称改为了 PULL_REQUEST_TEMPLATE

9. Git 分支的目录管理

Git 的分支就是在 .git/refs/heads 目录下的一个文件,文件内容指向某一条 Git 记录。

在实践主干集成、分支开发的过程中,通常会产生大量分支。使用目录可以很好地对 Git 分支进行管理。目录分支与普通的分支一样,只不过分支名带了目录分割符 /

1
2
3
4
5
6
7
8
git branch

*bugfix/1/1
feature/2/1
hotfix/3/1
release/4/1
custom/5/1
master

在有些 Git 工具中,可以以目录的形式展示分支,例如:SourceTree、BitBucket 。