管理 Git 代码库的 6 个最佳实践

抵制在 Git 中添加难以管理的内容的冲动;以下是应该采取的措施。
96 位读者喜欢这个。
Working from home at a laptop

Opensource.com

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

了解你的代码库

Git repository terminal

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

禁止二进制大对象

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

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

将第三方库保持为第三方

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

抵制盲目地使用 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

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.