管理 Git 仓库的 6 个最佳实践

抵制在 Git 中添加使管理变得更困难的东西的冲动;以下是应该做的事情。
96 位读者喜欢这篇文章。
Working from home at a laptop

Opensource.com

访问源代码使分析应用程序的安全性和安全性成为可能。但是如果实际上没有人查看代码,则问题将不会被发现,即使当人们积极查看代码时,通常也有很多东西要查看。幸运的是,GitHub 有一个活跃的安全团队,最近,他们 揭露了一个特洛伊木马,该木马已提交到多个 Git 仓库中,甚至躲过了仓库所有者。虽然我们无法控制其他人如何管理他们自己的仓库,但我们可以从他们的错误中吸取教训。为此,本文回顾了将文件添加到您自己的仓库时的一些最佳实践。

了解你的仓库

Git repository terminal

这可以说是安全 Git 仓库的零规则。作为项目维护者,无论您是自己启动的还是从其他人那里采用的,了解您自己的仓库的内容都是您的工作。您可能没有记住代码库中每个文件的列表,但是您需要了解您正在管理的基本组件。如果在几十次合并后出现一个游离文件,您将很容易发现它,因为您不知道它的用途,并且您需要检查它以刷新您的记忆。发生这种情况时,请查看该文件并确保您完全理解为什么它是必要的。

禁止二进制 blob

Git binary check command in terminal

Git 旨在用于文本,无论是用纯文本编写的 C、Python 还是 Java,还是 JSON、YAML、XML、Markdown、HTML 或类似的东西。Git 不适合二进制文件。

这是以下两者之间的区别

$ cat hello.txt
This is plain text.
It's readable by humans and machines alike.
Git knows how to version this.

$ git diff hello.txt 
diff --git a/hello.txt b/hello.txt
index f227cc3..0d85b44 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,3 @@
 This is plain text.
+It's readable by humans and machines alike.
 Git knows how to version this.

和这个

$ git diff pixel.png
diff --git a/pixel.png b/pixel.png
index 563235a..7aab7bc 100644
Binary files a/pixel.png and b/pixel.png differ

$ cat pixel.png
�PNG
▒
IHDR7n�$gAMA��
              �abKGD݊�tIME�

                          -2R��
IDA�c`�!�3%tEXtdate:create2020-06-11T11:45:04+12:00��r.%tEXtdate:modify2020-06-11T11:45:04+12:00��ʒIEND�B`�

二进制文件中的数据无法像纯文本那样被解析,因此如果二进制文件中的任何内容发生更改,则必须重写整个文件。一个版本和另一个版本之间唯一的区别是所有内容,这会很快累积。

更糟糕的是,二进制数据无法由您(Git 仓库维护者)合理地审计。这违反了零规则:了解您的仓库中有什么。

除了常用的 POSIX 工具外,您还可以使用 git diff 检测二进制文件。当您尝试使用 --numstat 选项 diff 一个二进制文件时,Git 返回一个空结果

$ git diff --numstat /dev/null pixel.png | tee
-     -   /dev/null => pixel.png
$ git diff --numstat /dev/null file.txt | tee
5788  0   /dev/null => list.txt

如果您正在考虑将二进制 blob 提交到您的仓库,请先停下来考虑一下。如果是二进制文件,则是由某些东西生成的。是否有充分的理由不在构建时生成它们,而是将它们提交到您的仓库?如果您决定提交二进制数据确实有意义,请确保在 README 文件或类似文件中标识二进制文件在哪里、为什么是二进制文件以及更新它们的协议是什么。更新必须谨慎执行,因为对于您提交到二进制 blob 的每个更改,该 blob 的存储空间实际上都会加倍。

保持第三方库为第三方

第三方库也不例外。虽然您可以自由地重用和重新分发您没有编写的代码是开源的众多好处之一,但有很多充分的理由不将第三方库放在您自己的仓库中。首先,除非您自己审查了所有代码(和未来的合并),否则您无法确切地保证第三方。其次,当您将第三方库复制到您的 Git 仓库中时,它会将焦点从真正的上游源分散开来。对库有信心的人在技术上只对库的主副本有信心,而不是对随机仓库中存在的副本有信心。如果您需要锁定到特定版本的库,请向开发人员提供您的项目需要的版本的合理 URL,或者使用 Git Submodule

抵制盲目 git add

Git manual add command in terminal

如果您的项目是编译的,请抵制使用 git add .(其中 . 是当前目录或特定文件夹的路径)作为添加任何和所有新内容的简便方法的冲动。如果您不是手动编译您的项目,而是使用 IDE 为您管理您的项目,这一点尤其重要。当 IDE 管理您的项目时,可能很难跟踪已添加到您的仓库中的内容,因此重要的是只添加您实际编写的内容,而不是项目中弹出的任何新对象。

如果您确实使用 git add .,请在推送之前查看暂存区中的内容。如果您在执行 git status 时在您的项目文件夹中看到一个不熟悉的对象,请查明它的来源以及为什么在您运行 make clean 或等效命令后它仍然在您的项目目录中。很少有构建工件在编译期间不会重新生成,因此在提交之前请三思。

使用 Git ignore

Git ignore command in terminal

为程序员构建的许多便利工具也非常嘈杂。任何项目(编程、艺术或其他)的典型项目目录都布满了隐藏文件、元数据和剩余工件。您可以尝试忽略这些对象,但是 git status 中的噪音越多,您就越有可能错过某些东西。

您可以通过维护良好的 gitignore 文件来为您 Git 过滤掉这些噪音。由于这是任何使用 Git 的人的常见要求,因此有一些入门级 gitignore 文件可用。Github.com/github/gitignore 提供了几个专门构建的 gitignore 文件,您可以下载并放入您自己的项目中,并且 Gitlab.com 在几年前将 gitignore 模板集成到仓库创建工作流程中。使用这些来帮助您为您的项目构建合理的 gitignore 策略,并坚持下去。

审查合并请求

Git merge request

当您通过电子邮件收到合并或拉取请求或补丁文件时,不要仅仅测试它以确保它有效。阅读进入您的代码库的新代码并了解它是如何产生结果是您的工作。如果您不同意该实现,或者更糟糕的是,您不理解该实现,请向提交它的人发送消息并要求澄清。质疑旨在成为您仓库中永久组成部分的代码不是社交失礼,但是不了解您合并到用户将要使用的代码中的内容违反了您与用户的社会契约。

负责任地使用 Git

开源中良好的软件安全性是一项社区努力。不要在您的仓库中鼓励不良的 Git 实践,也不要忽视您克隆的仓库中的安全威胁。Git 功能强大,但它仍然只是一个计算机程序,因此请成为方程式中的人,并确保每个人的安全。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算行业工作,而且经常同时进行。

3 条评论

第一张和最后一张截图中显示的彩色终端 git 查看器程序是什么?看起来很有趣。

看起来像 'tig'

回复 作者 Dan C

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.