《Git 简易速速上手小册》第8章:保护你的代码(2024 最新版)

在这里插入图片描述

文章目录

  • 8.1 使用 `.gitignore` 优化你的仓库
    • 8.1.1 基础知识讲解
    • 8.1.2 重点案例:为 Python 项目配置 `.gitignore`
    • 8.1.3 拓展案例 1:使用全局 `.gitignore`
    • 8.1.4 拓展案例 2:忽略已经被跟踪的文件
  • 8.2 管理敏感数据
    • 8.2.1 基础知识讲解
    • 8.2.2 重点案例:为 Python 应用配置环境变量
    • 8.2.3 拓展案例 1:使用 `git-secret` 加密存储敏感数据
    • 8.2.4 拓展案例 2:使用云服务管理 API 密钥
  • 8.3 安全实践与权限控制
    • 8.3.1 基础知识讲解
    • 8.3.2 重点案例:为 Python 项目实施分支保护
    • 8.3.3 拓展案例 1:使用 Code Owners 自动要求审查
    • 8.3.4 拓展案例 2:利用 Git 钩子增强安全性

8.1 使用 .gitignore 优化你的仓库

在每个 Git 仓库的生命中,.gitignore 文件扮演着守门人的角色,决定哪些文件可以进入仓库的殿堂,哪些应该被留在门外。正确配置 .gitignore 文件是保持仓库整洁、减少不必要的项目体积和避免敏感信息泄露的关键步骤。

8.1.1 基础知识讲解

  • 作用与重要性.gitignore 文件告诉 Git 哪些文件或目录是不应该被添加到版本控制中的。这通常包括编译产生的文件、系统生成的文件、包管理器的目录(如 Python 的 venv 目录)和开发工具生成的配置文件等。
  • 配置方法:在项目的根目录下创建一个 .gitignore 文件,并在文件中指定要忽略的文件模式。Git 会自动识别并应用这些规则。

8.1.2 重点案例:为 Python 项目配置 .gitignore

假设你正在开发一个 Python Web 应用,并希望确保所有不必要的文件都不会被提交到仓库中。

步骤

  1. 在项目的根目录下创建 .gitignore 文件。
  2. 添加以下内容来忽略常见的不必要文件:
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*.so# Virtual environment
venv/
.env# IDE settings
.idea/
*.swp
*.swo
.vscode/

这样配置后,Git 将会忽略上述指定的文件和目录,使得你的仓库更加干净、轻便。

8.1.3 拓展案例 1:使用全局 .gitignore

如果你有一些通用的忽略规则适用于所有项目(比如编辑器的临时文件),你可以配置一个全局的 .gitignore 文件。

步骤

  1. 创建一个全局 .gitignore 文件,例如在你的用户目录下:
touch ~/.gitignore_global
  1. 添加通用忽略规则,如:
.DS_Store
*.log
  1. 通过 Git 配置命令指定这个文件为全局 .gitignore
git config --global core.excludesfile ~/.gitignore_global

8.1.4 拓展案例 2:忽略已经被跟踪的文件

有时候,你可能会意外地提交了应该被忽略的文件。要从 Git 仓库中移除这些文件(但保留在本地),你可以使用以下命令:

git rm --cached FILENAME

然后,确保 .gitignore 已经正确配置以忽略未来的提交。

通过本节,你已经了解了如何有效地使用 .gitignore 来优化你的仓库,不仅使其更加整洁,也提高了项目的安全性。记住,良好的 .gitignore 配置是每个项目成功的基石之一。现在,就让我们采取行动,为你的项目构建一个强大的 .gitignore 防线吧!

在这里插入图片描述


8.2 管理敏感数据

在开发过程中,管理敏感数据是维护项目安全的关键一环。无论是 API 密钥、数据库密码还是配置文件,不当地处理这些信息都可能导致安全漏洞。幸运的是,有多种方法可以帮助我们安全地管理这些敏感数据,而不必将它们硬编码在源代码中。

8.2.1 基础知识讲解

  • 环境变量:使用环境变量是管理敏感数据的一种常见做法。它们可以在运行时提供给应用,而不是存储在项目的代码库中。
  • 加密秘钥:对于存储或版本控制中必须包含的配置文件,可以使用工具对敏感数据进行加密。
  • 专用管理工具:使用如 HashiCorp Vault、AWS Secrets Manager 或 Azure Key Vault 这样的秘钥管理服务,可以为敏感信息提供额外的安全层。

8.2.2 重点案例:为 Python 应用配置环境变量

假设你正在开发一个 Python Web 应用,需要访问数据库,但你不想在代码中直接包含数据库的连接字符串。

步骤

  1. 在你的操作系统中设置环境变量。以 Linux 或 macOS 为例:
export DATABASE_URL="你的数据库连接字符串"
  1. 在你的 Python 应用中,使用 os 模块来读取这个环境变量:
import osdatabase_url = os.getenv("DATABASE_URL")

这样,你的应用就可以在运行时获取数据库连接信息,而不需要将其存储在代码库中。

8.2.3 拓展案例 1:使用 git-secret 加密存储敏感数据

如果你的项目需要在版本控制中包含某些配置文件,但你想保护其中的敏感数据,git-secret 是一个有用的工具。

步骤

  1. 安装 git-secret 并初始化你的项目:
git secret init
  1. 将包含敏感数据的文件添加到 git-secret
git secret add my_sensitive_config.yml
  1. 加密文件:
git secret hide
  1. 提交其他人都可以安全获取但无法阅读的加密文件。

8.2.4 拓展案例 2:使用云服务管理 API 密钥

对于复杂的项目,使用云服务如 AWS Secrets Manager 来管理 API 密钥和其他敏感数据可以提供更高级的安全特性。

步骤

  1. 在 AWS Secrets Manager 中创建新的秘密来存储你的 API 密钥。
  2. 在你的应用中,使用 AWS SDK 来动态获取这些秘密:
import boto3
from botocore.exceptions import ClientErrordef get_secret():secret_name = "my_api_secret"region_name = "us-west-2"session = boto3.session.Session()client = session.client(service_name='secretsmanager',region_name=region_name)try:get_secret_value_response = client.get_secret_value(SecretId=secret_name)except ClientError as e:raise eelse:secret = get_secret_value_response['SecretString']return secret

通过本节,你已经学会了几种管理敏感数据的方法,从使用环境变量到利用专用工具加密和存储秘密信息。这些方法不仅可以帮助你保护敏感数据免受泄露,还能维护项目的整洁和安全。记住,处理敏感信息时总是要谨慎,采取所有必要的预防措施来保护你的项目和用户数据的安全。现在,让我们采取行动,实施这些最佳实践吧!
在这里插入图片描述


8.3 安全实践与权限控制

在任何软件项目中,实施有效的安全实践和权限控制机制是至关重要的。这不仅有助于保护代码免受未授权访问和修改,还能确保敏感信息不被泄露。Git 和各种托管平台提供了多种工具和设置,让你能够精细控制谁可以访问和修改你的代码。

8.3.1 基础知识讲解

  • 分支保护:大多数 Git 托管服务,如 GitHub、GitLab 和 Bitbucket,都提供了分支保护功能,使你能够限制对关键分支的写入访问。
  • 权限分级:通过为不同的团队成员分配不同级别的权限(如读取、写入、管理员权限),可以精确控制他们对仓库的访问和操作能力。
  • 审核日志:使用托管服务提供的审核日志功能来跟踪谁做了什么更改,有助于增强安全性和透明度。

8.3.2 重点案例:为 Python 项目实施分支保护

假设你正在开发一个 Python 应用,并使用 GitHub 作为代码托管平台。你希望确保 main 分支免受未经审查的更改。

步骤

  1. 登录 GitHub,导航到你的项目仓库。
  2. 进入 “Settings” > “Branches”,点击 “Add rule” 来为 main 分支添加保护规则。
  3. 在 “Branch protection rules” 中,启用 “Require pull request reviews before merging”。你也可以选择其他保护选项,如 “Require status checks to pass before merging”。

8.3.3 拓展案例 1:使用 Code Owners 自动要求审查

在大型项目中,使用 GitHub 的 Code Owners 功能自动指定合适的审查者对特定部分的更改进行审查,可以进一步提升代码质量和安全性。

步骤

  1. 在仓库根目录创建一个 CODEOWNERS 文件。
  2. 添加规则指定代码所有者,例如:
# 指定 @username 为根目录下所有 Python 文件的代码所有者
*.py @username

这样,每当有人提交了 Python 文件的更改,@username 将自动被要求审查这些更改。

8.3.4 拓展案例 2:利用 Git 钩子增强安全性

你可以利用服务器端 Git 钩子(如 pre-receive 钩子)来执行自定义脚本,审核即将被推送到仓库的提交,确保它们符合你的安全策略。

步骤

  1. 在服务器端仓库的 .git/hooks 目录中创建 pre-receive 脚本。
  2. 编写脚本来检查提交是否符合你的安全标准,例如,检查是否包含了明文存储的敏感信息。

通过本节,你已经了解了如何在你的项目中实施安全实践和权限控制,从而保护你的代码免受未经授权的访问和更改。无论是通过分支保护、权限分级还是利用 Git 钩子,都是保持你的项目安全的有效方法。记住,持续审查和改进你的安全策略是保护项目不断增长和发展的关键。现在,就让我们将这些实践应用到你的工作中,构建更安全、更可靠的软件项目吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

少儿编程考级:智慧启迪还是智商税?

在当前科技日新月异的时代背景下,少儿编程教育日益受到家长和社会的广泛关注。与此同时,各类少儿编程考级应运而生,引发了公众对于其价值和意义的深度探讨。一部分人认为这是对孩子逻辑思维与创新能力的有效锻炼,是智慧启迪的重要…

【JavaScript】数据类型

文章目录 1. 数字(Number)2. 字符串(String)3. 布尔(Boolean)4. 对象(Object)5. 数组(Array)6. Undefined 和 Null7. typeof 操作符总结 在 JavaScript 中&am…

[Python] opencv - 什么是直方图?如何绘制图像的直方图?如何对直方图进行均匀化处理?

什么是直方图? 直方图是一种统计图,用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分,然后计算在每个区间或组内的数据频数或频率(即数据出现的次数或占比),然后用矩形或者柱形图的形式将这…

《Docker极简教程》--Docker环境的搭建--在Mac上搭建Docker环境

在Mac上搭建Docker环境,可以提供一个可靠的容器化开发和部署平台。下面将详细介绍在Mac上搭建Docker环境的步骤、注意事项和常见问题解决方法。 一、步骤 在Mac上搭建Docker环境的步骤如下: 下载Docker Desktop:Docker Desktop是适用于Mac…

Python(20)正则表达式(Regular Expression)中常用函数用法

大家好!我是码银🥰 欢迎关注🥰: CSDN:码银 公众号:码银学编程 正文 正则表达式 粗略的定义:正则表达式是一个特殊的字符序列,帮助用户非常便捷的检查一个字符串是否符合某种模…

5.electron之主进程起一个本地服务

如果可以实现记得点赞分享,谢谢老铁~ Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、…

Python_百度贴吧评论情感分析

一、评论爬取 以百度贴吧中“美团骑手吧”为例,对页面中的帖子评论进行爬取,并将结果以json的格式保存到本地中。 from lxml import etree import requests import json# 根据网页url获取评论 def GetComments(url):# 使用requests库发送GET请求&#…

背包dp第六讲:混合背包板子及例题

特征 混合背包,就是把01,完全,多重背包混合起来 物品一共有三类: 第一类物品只能用1次(01背包); 第二类物品可以用无限次(完全背包); 第三类物品最多只能用…

Multisim14.0仿真(五十五)汽车转向灯设计

一、功能描述: 左转向:左侧指示灯循环依次闪亮; 右转向:右侧指示灯循环依次闪亮; 刹车: 所有灯常亮; 正常: 所有灯熄灭。 二、主要芯片: 74LS161D 74LS04D 74…

获取对象边及边对应的顶点索引

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a;获取对象边及边对应的顶点索引 prj name: CellEdges #include <vtkIdList.h> #include <vtkNew.h> #include <vtkPoint…

谁是嫌疑犯问题

问题描述&#xff1a; 有6名犯罪嫌疑人A、B、C、D、E、F&#xff0c;已知如下事实&#xff1a; A、B至少有1人作案&#xff1b; A、E、F三人中至少有2人参与作案&#xff1b; A、D不可能是同案犯&#xff1b; B、C或同时作案&#xff0c;或与本案无关&#xff1b; C、D中…

爱情终结,旅程重启:独自征服拉萨与四姑娘山

爱情&#xff0c;是人生中一段充满激情和期待的旅程&#xff0c;然而有时它也会成为人生中一场无法避免的终结。当爱情逝去&#xff0c;留下的是一片空虚和失落&#xff0c;但或许正是在这片失落中&#xff0c;我找到了重新定义自我的机会。独自踏上旅途&#xff0c;成为了越来…

Kubernetes CNI Calico:Route Reflector 模式(RR) calico IPIP切换RR网络模式

1. 概述 Calico 路由反射模式是一种 BGP 互联方案,用于解决大规模网络中路由信息的分发和同步问题。在 Calico 的路由反射模式中,路由反射器(Route Reflectors)被用来集中管理路由信息,以减少网络中的路由信息数量和减小路由信息的分发规模。 在 Calico 的路由反射模式中…

[office] Excel如何快速统一数字编号长度 #经验分享#其他

Excel如何快速统一数字编号长度 我们在办公室使用Excel统计数据的时候&#xff0c;经常会遇到第一列数据全部是数字编号&#xff0c;但是因为数字的位数不一样&#xff0c;长短不一的样子看起来不是很协调。那么如何快速统一数字编号长度呢&#xff1f;一起来了解一下吧 我们在…

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…

五大架构风格之三:独立构件风格

独立构件风格介绍&#xff1a; 独立构件风格&#xff08;模块化、组件化、分布式组件&#xff09;是一种软件架构风格&#xff0c;其中系统被划分为一组相互协作但逻辑上独立的构件。每个构件在设计时都具有清晰的接口和职责&#xff0c;可以在运行时独立部署、升级而不影响整个…

【chromium】windows构建base库 3:gn + vs2022 args 设置及debug x86 构建

GN 构建配置GN 构建配置 此页面提供了 GN 构建的一些常见构建设置。它假设您已经获得了 Chromium checkout。 也可以看看 从命令行运行“gn help”。 所有 GN 文档 GN 快速入门指南 GN 参考 (一个网页中“gn help”中所有内容的转储)。 了解 GN 构建标志 回想一下,在 GN …

tomcat部署zrlog

1.下载zrlog包&#xff0c;并添加到虚拟机中 1)进入/opt/apache-tomcat-8.5.90/webapps目录 cd /opt/apache-tomcat-8.5.90/webapps2)下载zrlog包 wget http://dl.zrlog.com/release/zrlog-1.7.1-baaecb9-release.war 3)重命名包 mv zrlog-1.7.1-baaecb9-release zrblog 2…

【Linux】环境基础开发工具的使用之gdb详解(三)

前言&#xff1a;上一篇文章中我们讲解了Linux下的gcc与g的使用&#xff0c;今天我们将进一步的学习gdb与makefile来帮我们更好的理解与使用基础开发工具。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; …

R语言入门笔记2.2

ifelse语句 结构&#xff1a;ifelse(条件,表达式1,表达式2) #满足条件&#xff0c;则进入表达式1&#xff0c;否则为表达式2 例1&#xff1a; > a1 > ifelse(a<0,"a小于0",ifelse(a0,0,"a大于0")) [1] "a大于0"a1 - 这行代码给变量a…