在开发过程中,我们经常需要在不同分支之间切换。传统的做法是使用 git stash 暂存当前工作,切换分支完成紧急任务后,再切换回来恢复工作。这种方式效率低下且容易出错。Git Worktree 提供了一种更优雅的解决方案——允许你同时检出多个分支到不同的工作目录。 什么是 Git Worktree? Git Worktree 是 Git 的原生功能(自 Git 2.5 版本起),允许你将同一个仓库的多个分支同时检出到不同的工作目录。所有工作目录共享同一个 Git 仓库对象数据库,但各自维护独立的工作文件状态。 Worktree 的特点 原生支持:无需额外安装,Git 内置功能 独立工作区:每个工作目录有独立的文件状态和索引 共享仓 …
Read More在管理多个相关项目时,我们经常需要在一个 Git 仓库中引用另一个仓库的代码。Git 提供了两种主要方案:Submodule 和 Subtree。本文将详细介绍 Git Subtree 的使用方法、最佳实践以及它与 Submodule 的区别。 什么是 Git Subtree? Git Subtree 是一个 Git 原生功能(自 Git 1.7.11 版本起),允许你将一个仓库作为另一个仓库的子目录。与 Submodule 不同,Subtree 将外部仓库的代码直接合并到主仓库中,不存储为特殊的引用。 Subtree 的特点 原生支持:无需额外安装,Git 内置功能 透明性:子树的代码就是普通的提交记录 独立性:主仓库和子树仓库可 …
Read More在日常使用 Docker 时,我们可能会遇到这样一个场景:本地有一个镜像(比如 n8nio/n8n:latest),但我们想知道这个镜像具体对应 Docker Hub 上的哪个版本 tag。因为 latest 标签只是指向最新的版本,它实际上对应的是一个具体的版本号(如 1.0.0、1.2.3 等)。本文将介绍如何通过镜像的 digest 值来找到对应的 tag。 什么是 Digest? Docker 镜像的 digest 是镜像内容的 SHA256 哈希值,它是镜像的唯一标识符。每个镜像层和整个镜像都有一个 digest 值。当你拉取一个镜像时,Docker 会计算并验证这个 digest 值来确保镜像的完整性。 获取本地镜像的 …
Read MoreGit Submodule 是一个强大但常被误解的功能。它允许你将一个 Git 仓库嵌入到另一个 Git 仓库中,保持两者的独立性。本文将带你全面了解 Submodule 的工作原理和实际应用。 什么是 Git Submodule? Git Submodule 允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。它能保持子项目独立开发的同时,将子项目纳入主项目的版本控制中。 典型使用场景 库的复用:多个项目共享同一个代码库 第三方依赖:管理开源库或框架的特定版本 主题管理:如 Hugo 博客使用第三方主题 微服务架构:相关服务的代码组织 基础操作 添加 Submodule 1# 基本语法 2git submodule add …
Read More在现代 Linux 系统管理中,网络文件系统(Network File System,NFS)扮演着至关重要的角色。无论是 Web 服务器集群共享静态资源、容器环境下的持久化存储,还是企业级的备份集中化存储,NFS 都是不可或缺的基础设施组件。 本文将系统性地介绍 NFS 的核心概念、从基础配置到高级应用、从性能调优到安全加固,帮助你全面掌握这一强大的网络存储技术。 NFS 核心概念 什么是 NFS? NFS(Network File System)是由 Sun Microsystems 开发的分布式文件系统协议,允许客户端系统像访问本地文件一样访问远程服务器上的文件。NFS 基于 ONC RPC(Open Network …
Read More在当今的互联网环境中,HTTPS 已成为网站的标配。Let's Encrypt 提供免费的 SSL 证书,使得任何网站都能轻松启用加密连接。acme.sh 是一款优秀的 ACME 协议客户端,它完全用 Shell 脚本编写,无需 Python 等依赖,支持多种验证方式和 DNS 提供商,是证书自动化管理的理想选择。 本文将全面介绍 acme.sh 的安装方法、核心功能以及实际应用场景,帮助你构建自动化的 SSL 证书管理体系。 acme.sh 核心概念 什么是 acme.sh? acme.sh 是一个用纯 Shell 语言编写的 ACME 协议客户端,用于从 Let's Encrypt、ZeroSSL、Buypass 等 CA 机构 …
Read More在 Golang 开发过程中,经常需要在不同项目间切换使用不同版本的 Go。有的项目依赖 Go 1.18,有的需要 Go 1.21,还有的可能要测试最新的 Go 1.22 beta 版本。手动安装和切换多个 Go 版本不仅繁琐,还容易出错。goenv 是一个简单高效的 Golang 多版本管理工具,它借鉴了 rbenv 和 pyenv 的设计理念,通过 shim 机制实现了优雅的版本切换。 简介 什么是 goenv goenv(syndbg/goenv)是一个 Golang 多版本管理工具,允许用户在同一台机器上安装、管理和切换多个 Go 版本。它的设计灵感来自于 Ruby 的 rbenv 和 Python 的 pyenv,因此如果 …
Read MoreChrony 是一款开源的网络时间协议 (NTP) 实现,专为 Linux 系统设计。相比于传统的 ntpd,Chrony 在处理不稳定的网络环境、间歇性网络连接以及虚拟机环境时表现更为出色。 Chrony vs ntpd 特性 Chrony ntpd 网络中断恢复 快速同步 同步较慢 虚拟机支持 优秀 一般 时钟频率调整 动态调整 固定调整 配置复杂度 简单 较复杂 内存占用 较低 较高 安装 Chrony Debian/Ubuntu 1sudo apt update 2sudo apt install chrony RHEL/CentOS/Rocky/AlmaLinux 1sudo dnf install chrony Arch …
Read More在Linux系统管理中,防火墙是保障服务器安全的第一道防线。对于许多系统管理员而言,直接配置底层的 iptables 规则往往过于复杂且容易出错。UFW(Uncomplicated Firewall,即简单防火墙)正是为了解决这一痛点而诞生的。作为 Ubuntu 和 Debian 系统的默认防火墙配置工具,UFW 通过简洁的命令行语法封装了复杂的 iptables 规则,让用户能够轻松、高效地管理防火墙策略。 本文将详细介绍 UFW 的核心概念、安装步骤以及常见场景下的配置方法,帮助你快速构建坚固的系统安全屏障。 UFW 核心概念 什么是 UFW? UFW 是 iptables 的前端工具,设计目标是简化防火墙管理。它将复杂的 …
Read MoreGo 语言内置了强大的测试框架,通过 go test 命令可以方便地进行单元测试、基准测试和示例测试。 基本概念 测试文件以 _test.go 结尾 测试函数以 Test 开头,参数为 *testing.T 基准测试函数以 Benchmark 开头,参数为 *testing.B 示例函数以 Example 开头,无参数 常用命令 1go test # 运行当前目录下的所有测试 2go test -v # 显示详细输出 3go test -run TestName # 运行指定的测试函数 4go test ./... # 递归测试所有子目录 5go test -cover # 显示测试覆盖率 6go test -bench . # 运 …
Read More