git-crypt 能够在 git 仓库中实现文件的透明加密和解密。你选择保护的文件在提交时会自动加密,在检出时会自动解密。git-crypt 允许你自由共享一个同时包含公开和私有内容的仓库。git-crypt 会优雅降级,因此没有密钥的开发者仍然可以克隆和提交包含加密文件的仓库。这样你可以将秘密材料(如密钥或密码)与代码存放在同一个仓库中,而无需锁定整个仓库。
git-crypt 由 Andrew Ayer ([email protected]) 编写。更多信息请访问 https://www.agwa.name/projects/git-crypt。
请参阅 INSTALL.md 文件。
配置一个仓库以使用 git-crypt:
cd repo
git-crypt init
通过创建 .gitattributes 文件来指定要加密的文件:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
与 .gitignore 文件类似,它可以匹配通配符,并且应被检入仓库。更多关于 .gitattributes 的信息请参见下文。确保你不会意外加密 .gitattributes 文件本身(或其他 git 文件如 .gitignore 或 .gitmodules)。确保你的 .gitattributes 规则在添加敏感文件之前已经到位,否则这些文件将不会被加密!
使用 GPG 与他人(或与自己)共享仓库:
git-crypt add-gpg-user USER_ID
USER_ID 可以是密钥 ID、完整指纹、电子邮件地址或任何能唯一标识 GPG 公钥的内容(请参阅 gpg 手册页中的“如何指定用户 ID”)。注意:git-crypt add-gpg-user 会在仓库根目录的 .git-crypt 目录中添加并提交一个 GPG 加密的密钥文件。
或者,你可以导出一个对称密钥,然后必须安全地传递给协作者(不需要 GPG,也不会向仓库添加任何文件):
git-crypt export-key /path/to/key
在克隆包含加密文件的仓库后,使用 GPG 解锁:
git-crypt unlock
或者使用对称密钥:
git-crypt unlock /path/to/key
这就是你需要做的全部——在 git-crypt 设置完成(无论是通过 git-crypt init 还是 git-crypt unlock)后,你可以正常使用 git——加密和解密都是透明进行的。
最新版本的 git-crypt 是 0.8.0,于 2025-09-23 发布。git-crypt 的目标是无错误且可靠,即不应崩溃、故障或泄露你的机密数据。然而,它尚未达到成熟状态,意味着在文档、功能性和易用性方面还有待完善。此外,在 1.0 版本之前可能会引入不向后兼容的更改。
git-crypt 比其他透明 git 加密系统更安全。git-crypt 使用 AES-256 在 CTR 模式下加密文件,并采用从文件的 SHA-1 HMAC 衍生出的合成初始化向量(IV)。这种操作模式在确定性选择明文攻击下具有可证明的语义安全性。这意味着尽管加密是确定性的(这是 git 区分文件是否更改所必需的),但它不会泄露除两个文件是否相同之外的任何信息。其他透明 git 加密方案使用 ECB 或带有固定 IV 的 CBC,这些系统不具备语义安全性,会泄露信息。
git-crypt 依赖于 git 过滤器,而过滤器在设计之初并未考虑加密。因此,对于仓库中大部分或全部文件的加密,git-crypt 并非最佳工具。git-crypt 真正擅长的场景是你的仓库大部分内容公开,但只有少数文件(例如名为 *.key 的私钥文件,或包含 API 凭证的文件)需要加密。如果你需要加密整个仓库,建议考虑使用 git-remote-gcrypt 等系统(注意:本文不对 git-remote-gcrypt 的安全性做出任何背书)。
git-crypt 不加密文件名、提交信息、符号链接目标、gitlink 或其他元数据。
git-crypt 不会隐藏文件是否更改、文件的长度或两个文件是否相同的事实(参见上面的“安全性”部分)。
git-crypt 不支持撤销之前授予的对加密仓库的访问权限。这既适用于多用户 GPG 模式(没有与 add-gpg-user 对应的 del-gpg-user 命令),也适用于对称密钥模式(不支持密钥轮换)。这是因为在历史数据的背景下,这是一个固有的复杂问题。例如,即使密钥在历史的某个点被轮换,拥有先前密钥的用户仍然可以访问仓库的先前历史记录。此问题在 https://github.com/AGWA/git-crypt/issues/47 中有更详细的讨论。
经过 git-crypt 加密的文件不可压缩。即使对加密文件进行最小的更改,git 也需要存储整个更改后的文件,而不是仅存储差异。
尽管 git-crypt 使用 SHA-1 HMAC 保护单个文件内容,但只有整个仓库受到防篡改保护时,才能安全使用 git-crypt(能够篡改仓库的攻击者可以更改你的 .gitattributes 文件以禁用加密)。如有必要,请使用 git 的特性(如签名标签)而不是仅依赖 git-crypt 来保证完整性。
经过 git-crypt 加密的文件无法通过 git-apply 应用补丁,除非补丁本身也是加密的。要生成加密的补丁,请使用 git diff --no-textconv --binary。或者,你可以在 git 之外使用 patch 命令应用明文补丁。
git-crypt 在某些第三方 git GUI 中无法可靠工作,例如 Atlassian SourceTree 和 GitHub for Mac。文件可能处于未加密状态。
.gitattributes 文件在 gitattributes(5) 手册页中有详细说明。文件模式格式与 .gitignore 使用的格式相同(见 gitignore(5) 手册页),但需要注意的是,仅指定目录(例如 /dir/)不足以加密其下的所有文件。
另外请注意,模式 dir/* 不匹配 dir/ 子目录下的文件。要加密整个子树 dir/,请使用 dir/**:
dir/** filter=git-crypt diff=git-crypt
.gitattributes 文件不能加密,因此请确保通配符不会意外匹配到它。如有必要,你可以像这样将 .gitattributes 排除在加密之外:
.gitattributes !filter !diff