在 Ubuntu 上安装 Git

2025年3月17日 | 阅读11分钟

Git 是一个开源的分布式版本控制系统,对所有人免费。它能够以高速度和高效率处理从小到大的项目。它旨在协调程序员之间的工作。版本控制允许您跟踪和与团队成员在同一个工作空间中协同工作。

Git 是最常用的源代码管理 (SCM) 系统,用户数量超过了 SVN 等早期 VCS 系统。让我们了解如何在 Ubuntu 服务器上安装 Git。

Git 简介

Git 侧重于数据完整性、速度和非线性、分布式工作流支持。最初,Git 于 2005 年由 Linus Torvalds 为 Linux 内核开发启动,其他内核开发者也对其早期开发做出了贡献。Junio Hamano 自 2005 年以来一直是主要维护者。

与几乎所有的客户端-服务器系统以及几乎所有的分布式版本控制系统不同,所有计算机上的 Git 目录都是一个完全开发的存储库,具有完整的版本跟踪和历史记录功能,无需中央服务器或网络访问。Git 是一个开源的免费软件,根据 GPL-2.0-only 许可证分发。

Git 简史

2005 年 4 月,在多位内核开发者放弃使用 BitKeeper(一个他们用于管理项目的 SCM (源代码管理) 系统)后,Git 的开发开始。

Linus Torvalds 希望拥有一个可以像 BitKeeper 一样使用的分布式系统,但现有的开源系统未能满足他的要求。Torvalds 曾提到一个源代码管理系统需要三十秒才能打一个补丁并更新所有相关元数据,并认为这无法满足 Linux 内核开发的规模需求,在 Linux 内核开发中,与同事维护者同步可能需要同时进行 250 次此类操作。他表示,根据他的设计原则,打补丁不应花费 3 秒以上,并补充了另外三个目的:

  • 添加强大的机制来防止损坏,无论是恶意的还是意外的。
  • 支持类似 BitKeeper 的分布式工作流。
  • 以 CVS (Concurrent Versions System) 为反面教材;如果不确定,则做出相反的决定。

Git 的设计

Git 的设计灵感来源于 Monotone 和 BitKeeper。最初 Git 被开发为一个版本控制系统的底层引擎,其他开发者可以为其指定前端,如 StGIT 或 Cogito。

特性

Git 的设计是 Torvalds 管理大型分布式开发项目的 Linux 经验、从类似项目获得的对文件系统性能的了解以及生成一个高效系统的需求的综合。这些条件导致了以下实现选项:

  • 支持非线性开发: Git 支持快速合并和分支,并包含用于导航和可视化非线性开发历史的专用工具。一个基本理念是,由于修改会经过多个审阅者,因此在 Git 中修改的合并频率会比编写代码的频率更高。在 Git 中,分支是轻量级的,分支只是对单个提交的引用。可以通过其父提交来创建完整分支的结构。
  • 分布式开发: 像 Monotone、Bazaar、Mercurial、BitKeeper 和 Darcs 一样,Git 为所有开发人员提供完整的开发历史副本,修改会从这些存储库复制到其他存储库。
  • 兼容旧协议和系统: 存储库可以通过 Git 协议、FTP、HTTP 或 HTTPS,在安全 Shell 或普通套接字上发布。
  • 高效处理大型项目: Torvalds 将 Git 定义为非常可扩展且快速,Mozilla 进行的性能测试表明,与 GNU Bazaar 和 Mercurial 相比,它处理大型存储库的速度快了一个数量级。
  • 历史加密认证: Git 的历史以一种形式存储,即特定版本的 ID 依赖于导致该提交的完整开发历史。
  • 基于工具的结构: Git 被开发为一组用 C 语言编写的程序和许多 shell 脚本,这些脚本提供了这些程序的封装。然而,其中许多脚本后来为了可移植性和速度而被重新设计为 C 语言。
  • 可插拔策略: Git 包含一个定义明确的缺失合并结构,并在其工具结构中包含两个或多个算法来完成它。

数据结构

Git 的基本单元本身并不是一个源代码管理系统。Git 集成了经典 SCM 所需的全部功能,这些功能大多是根据需要创建的,然后从这种初始设计方法中不断完善和增强。

Git 包含两种不同的数据结构。第一种数据结构是一个可变的索引(也称为缓存或暂存区),它缓存有关活动目录和即将提交的修订版的信息。第二种数据结构是一个仅追加的不可变对象数据库。

不可变数据库包含五种对象类型:

  • Blob
  • Tree
  • 提交
  • 标签
  • Packfile

Blob: Blob 是二进制大对象的缩写,表示文件的内容。Blob 不包含时间戳、文件名或其他元数据。所有 Blob 都是 Git 中文件的一个版本,它保存文件的数据。

Tree: Tree 对象相当于一个目录。它包含一个文件列表,每个文件都带有几个类型位和一个指向 Tree 对象或 Blob 的引用,该引用是文件、目录或符号链接的内容。这些对象是源树的快照。

Commit: Commit 对象将 Tree 对象与历史联系起来。它包含一个 Tree 对象名称、一条日志消息、一个时间戳以及一个或多个父 Commit 对象名称。

Tag: Tag 对象可以描述为一个容器,它包含对其他对象的引用,并且可以存储与 Git 所跟踪的特定数据版本相关的附加元数据。它最常用于存储 Git 所跟踪的特定数据版本的任何 Commit 对象的数字签名。

Packfile: Packfile 对象将多个其他对象收集到一个 zlib 压缩的组中,以便于传输和在网络协议上保持紧凑。

Git 还存储称为 refs(或 references)的标签,以表示多个提交的位置。它们是:

  • Heads (branches)
  • HEAD
  • 标签

所有对象都由其内容的 SHA-1 哈希值标识。Git 计算哈希值并将其值应用于对象的名称。该对象被放置在一个与哈希值的前两个字符相同的目录中。剩余的哈希值用作对象的 E 盘文件名。

此外,Git 将所有文件修订版存储为特殊的 blob。通过检查 Commit 和 Tree 对象可以检测这些 blob 之间的关系。新添加的对象通过 zlib 压缩以其原始形式存储。这会很快消耗大量磁盘空间,因此可以将对象合并到 pack 中,pack 应用增量压缩以节省空间,将 blob 保存为它们相对于其他 blob 的修改。

  • Heads (branches): Heads 是命名的引用,在创建新的 Commit 时会自动指向新的 Commit。
  • HEAD: 这是一个存储的 head,将针对活动树进行分析以构建 Commit。
  • Tags: 这些与分支引用相同,但指向特定的 Commit。Tag 用于标记历史中的重要点。

引用

在 Git 数据库中,引用是所有未被显式引用或通过垃圾收集命令自动清理的对象。一个对象可能由一个显式引用或另一个对象引用。Git 知道不同的引用类型。创建、移动或删除引用的命令有所不同。git show-ref 命令可以列出所有引用。一些类型包括:

  • heads: 本地指向对象;
  • remotes: 指向远程存储库中的任何对象;
  • meta: 例如,裸存储库中的配置;命名空间,即 refs/meta/config 是追溯声明的,由 Gerrit 使用。
  • stash: 指向任何尚未提交的对象。

Git 的实现

主要来说,Git 是在 Linux 上开发的。此外,它还支持最主流的操作系统,如 BSD(FreeBSD、OpenBSD、NetBSD 和 DragonFly BSD)、Windows、macOS 和 Solaris。

第一个 Git Windows 端口主要是 Linux 仿真环境,托管 Linux 版本。在 Windows 下,安装 Git 会创建一个同名的程序文件目录,其中包含 MSYS2 的 Mingw-e64 端口、Perl 5、GNU 编译器集合以及许多其他 Linux 库和实用程序的 Windows 仿真或端口。原生的 Windows Git 构建目前以 64 位和 32 位安装程序的形式分发。目前,Git 的官方网站提供了 Windows 版 Git,仍然使用 MSYS2 环境。

  • Git 的 JGit 实现是一个纯 Java 软件库,旨在安装在 Java 应用程序中。JGit 在代码审查工具 Gerrit 和 Eclipse IDE 的 Git 客户端 EGit 中使用。
  • Go-Git 是一个纯 Go 语言编写的 Git 开源实现。
  • 目前,它被用作 SQL 接口来备份 Git 代码存储库的项目,并提供 Git 加密。
  • 对于 Python 的 3.5、3.4 和 2.7 版本,Git Dulwich 实现是一个纯 Python 软件组件。
  • Git libgit2 实现是一个 ANSI C 软件库,没有其他依赖项,支持多种平台,如 BSD、macOS、Linux 和 Windows。它包含多种编程语言的绑定,如 Haskell、Python 和 Ruby。
  • JS-Git 是 JavaScript 版的 Git 子集实现。

Git 服务器

Git 可以用作服务器,因为它是一个分布式的版本控制系统。它通过内置的 git daemon 命令导出,该命令启动一个在 GIT 协议上活动的 TCP 服务器。通过包含访问控制、通过 Web 界面显示 Git 存储库内容以及处理多个存储库,Git 支持 HTTP 服务器。

现有的 Git 存储库可以被复制和分发,以便被他人用作集中式存储库。此外,只需安装 Git 软件并允许用户登录,就可以通过远程 shell 访问它。通常,Git 服务器监听 TCP 的 9418 端口。

开源

  • 通过 **Git Binary** 管理 Git 服务器。
  • Phabricator,它是 Facebook 的一个分支。Git 的支持不如其他平台突出,因为 Facebook 主要使用 Mercurial。
  • Gerrit,这是一个可配置的 Git 服务器,用于代码审查,并通过 SSH、增强的 OpenSSH 或 Apache MINA,或增强的 Jetty Web 服务器提供访问。Gerrit 支持 X509、Kerberos/GSSAPI、OAuth、OpenID、Active Directory 和 LDAP HTTPS 客户端证书集成。

Gerrit 的 3.0 版本中,所有配置都将保留为 Git 存储库,并且不需要数据库即可运行。Gerrit 在核心中包含一个拉取请求功能,尽管缺乏 GUI。

  • Kallithea 使用 Python 编写,遵循 GPL 许可证,支持 Mercurial 和 Git。
  • RhodeCode CE (社区版),遵循 AGPLv3 许可证,支持 Git、Subversion 和 Mercurial。
  • 还有许多其他 FLOSS 解决方案可供自托管,例如 Gitea 和 Gogs,两者都使用 Go 语言编写,遵循 MIT 许可证。
  • 外部项目,例如 gitolite,提供 Git 软件的脚本,以实现优雅的访问控制。

Git 服务器即服务

有几种 Git 存储库服务可供使用。一些最著名的包括 GitLab、Bitbucket、SourceForge 和 GitHub。

Git 的采用

截至 2014 年 5 月,Eclipse Foundation 在其调查中指出,Git 是最广泛使用的源代码管理工具,42.9% 的专业应用程序开发人员表示他们将 Git 作为其主要源代码控制系统。Black Duck Open Hub 开源目录报告了开源项目之间类似的采用率。

另一方面,Stack Overflow 在 2015 年、2017 年、2018 年和 2022 年的调查中增加了版本控制。在这些调查中,Git 是受访开发人员的最爱,在 2022 年的比例高达 93.9%。

Extensions

有几种 Git 扩展,例如 Git LFS,已经可用,它最初是 GitHub 社区中的一个 Git 扩展,现在已被其他存储库广泛使用。通常,扩展是由多个独立的人开发和管理的,尽管一个被广泛使用的扩展最终可能会被合并到 Git 中。

其他一些开源 Git 扩展包括:

  • git-flow 是一组 Git 扩展,用于实现 Vincent Driessen 分支模型的 H 级存储库任务。
  • git-annex 是一个基于 Git 的分布式文件同步系统。
  • git-machete 是一个存储库组织者和工具,用于自动化 rebase/merge/push/pull 任务。

Microsoft 开发的 **VFS** (Virtual File System) for Git(以前称为 **GVFS** 或 **Git Virtual File System**)扩展,用于管理 Windows 的源代码树大小,作为其 2017 年从 Perforce 迁移的一部分。Git Virtual File System 允许克隆存储库使用一个代理,该代理的内容可以在文件被使用时下载。

Git 的安全性

Git 不提供访问控制技术,但它被设计为与其他擅长访问控制的工具配合使用。

2014 年 12 月 17 日,在 macOS 和 Windows Git 客户端版本中发现了一个漏洞。攻击者可以通过在存储库中创建一个名为 **.git** 的恶作剧 Git 树(具有不同的案例)并在子目录 **.git/hooks** 中放置一些恶意文件,在目标系统上实现任意代码执行,该存储库由攻击者创建或由攻击者修改。

Git 的 2.6.1 版本(发布于 2015 年 9 月 29 日)包含了一个允许任意代码执行的安全漏洞补丁。如果攻击者能够诱使受害者克隆一个命名 URL,那么此漏洞是难以察觉的,因为任意命令本身就设置在该 URL 中。此外,递归克隆也存在漏洞,因为它们允许存储库控制器通过 .gitmodules 文件定义任意 URL。

Git 安装

我在 Ubuntu 16.04 LTS 上完成了此安装。但给出的命令也应该适用于其他版本。

以下是在 Ubuntu 服务器上安装 Git 的步骤:

步骤 1:开始通用操作系统和包更新

首先,我们应该开始进行通用的操作系统和包更新。为此,请运行以下命令:

现在我们已经开始了通用的操作系统和包更新。在此之后,我们将运行服务器上的通用更新,以便我们可以开始安装 Git。为此,请运行以下命令:

步骤 2:安装 Git

要安装 Git,请运行以下命令:

上面的命令将在您的系统上安装 Git,但它可能会要求您确认下载和安装。

步骤 3:确认 Git 安装

要确认安装,请在编辑器中按 'y' 键。现在,Git 已安装并准备使用。

当中央安装完成后,首先检查以确保可执行文件已设置并可访问。最好的方法是使用 git version 命令。它将运行如下:

输出

git version 2.24.0

步骤 4:为首次使用配置 Git

现在您可以在系统上开始使用 Git 了。您可以探索版本控制系统的许多功能。要开始使用 Git,您需要配置初始用户访问过程。这可以通过 git config 命令完成。

假设我想注册一个用户,用户名为 "javaTpoint",邮箱地址为 "<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="">[email&#160;protected]</a>",那么它将如下完成:

要注册用户名,请运行以下命令:

要为给定作者注册电子邮件地址,请运行以下命令:

现在,您已成功为版本控制系统注册了一个用户。

重要的是要理解,**git config** 工具是按用户工作的。例如,如果我们在 Git 上注册了一个名为 "john" 的用户。那么在同一台机器上,还可以有另一个名为 "Mike" 的用户注册在 Git 上。为此,Mike 必须从他的用户帐户运行相同的命令。两个用户提交的提交都将以他们的详细信息在 Git 中完成。

要深入了解 git config 命令,请访问 此处