:手册章节: 1
git-remote-gcrypt 是一个 git 远程辅助工具,用于推送和拉取使用 GnuPG 加密的仓库,采用自定义格式。该远程辅助工具处理以 gcrypt:: 为前缀的 URI。
支持的后端有 local、rsync:// 和 sftp://,仓库以一组文件的形式存储;也可以是任意 <giturl>,此时 gcrypt 会将相同的表示存储在一个 git 仓库中,通过任意 git 传输桥接。如果可能,优先使用 local 或 rsync://;性能方面的讨论见下文“性能”部分。
还有一个实验性的 rclone:// 后端,仅供早期采用者使用(注意:风险自负)。
目标是使用典型的不可信文件主机或服务,提供机密、经过身份验证的 git 存储和协作。
安装 ............
install.sh 脚本快速入门 ..........
通过推送到远程来创建加密远程仓库::
git remote add cryptremote gcrypt::rsync://example.com/repo
git push cryptremote master
> gcrypt: Setting up new repository
> gcrypt: Remote ID is :id:7VigUnLVYVtZx8oir34R
> [ more lines .. ]
> To gcrypt::[...]
> * [new branch] master -> master
支持以下 git-config(1) 变量:
remote.<name>.gcrypt-participants
..
gcrypt.participants
以空格分隔的 GPG 密钥标识符列表。远程仓库将向这些参与者加密,并且只接受来自这些参与者的签名。
gpg -k 列出所有您知道的公钥。
如果未设置此选项,我们将向您的默认密钥加密并接受任何有效签名。也可以通过将参与者设置为 ``simple`` 来显式请求此行为。
远程上的 ``gcrypt-participants`` 设置优先于仓库变量 ``gcrypt.participants``。
remote.<name>.gcrypt-publish-participants
..
gcrypt.publish-participants
默认情况下,通过使用 gpg -R 加密来隐藏参与者的 gpg 密钥 ID。将此选项设置为 true 会禁用该安全措施。
使用 ``gpg -R`` 的问题在于,解密时 gpg 会依次尝试每个可用的私钥,直到找到可用的密钥。这可能导致不必要的密码提示。
gcrypt.gpg-args
此设置的内容将作为参数传递给 gpg。例如 --use-agent。
remote.<name>.gcrypt-signingkey
..
user.signingkey
(后者来自常规 git 配置)用于签名的密钥。如果您的默认签名密钥不在参与者列表中,则应设置 user.signingkey。您可以使用远程特定版本来使用不同密钥对不同的远程仓库进行签名。
remote.<name>.gcrypt-rsync-put-flags
..
gcrypt.rsync-put-flags
在使用 rsync:// 后端上传到远程时传递给 rsync 的标志。如果标志是为特定远程设置的,则全局标志(如果也设置了)将不会应用于该远程。
remote.<name>.gcrypt-require-explicit-force-push
..
gcrypt.require-explicit-force-push
一个长期存在的 bug 是,每次 git 推送实际上都带有 --force。
如果此标志设置为 ``true``,则除非传递 ``--force`` 或 refspec 以 ``+`` 为前缀,否则 git-remote-gcrypt 将拒绝推送。
有一个潜在的解决方案:https://bugs.debian.org/877464#32
GCRYPT_FULL_REPACK 当设置时(设置为非空字符串),此环境变量会在推送时强制进行完全重新打包。
如何为两个参与者设置远程仓库::
git remote add cryptremote gcrypt::rsync://example.com/repo
git config remote.cryptremote.gcrypt-participants "KEY1 KEY2"
git push cryptremote master
如何使用 git 后端::
# 注意:目标 git 仓库必须已经存在,且其 `next` 分支将被覆盖!
git remote add gitcrypt gcrypt::[email protected]:repo#next
git push gitcrypt master
URL 片段(此处为 #next)指示使用的后端分支。
协作 每次推送时,清单的加密都会更新以匹配参与者配置。每个推送用户必须拥有所有协作者的公钥和正确的参与者配置。
依赖关系
rsync、curl 和 rclone 分别用于远程仓库 rsync:、sftp: 和 rclone:。主可执行文件需要一个支持 local 的 POSIX 兼容 shell。
GNU Privacy Guard
支持 GPG 1.4 和 2。您需要个人的 GPG 密钥。GPG 配置适用于公钥加密、对称加密和签名的算法选择。有关更多信息,请参见 man gpg。
远程 ID 远程 ID 不是秘密;它仅确保可以区分由同一用户签名的两个仓库。如果远程 ID 发生变化,您会看到警告,这应该只发生在远程被重新创建时。
性能
使用任意 <giturl> 或 sftp:// URI 需要在每次推送时上传整个仓库历史记录。这意味着随着 git 历史变长,您的仓库推送会变得越来越慢,并且很容易达到 git-remote-gcrypt 继续使用不切实际的程度。
因此,只有在您知道您的仓库永远不会变得非常大(而不仅仅是现在不大)时,才应使用这些后端。这意味着这些后端不适用于大多数仓库,可能只适用于特殊情况,例如小型凭据存储。即便如此,如果可能,请使用 `rsync://`。但请注意,`rsync://` 不适用于像 Gitolite、GitHub 或 GitLab 这样的仓库托管服务。
rsync URI
rsync 后端的 URI 格式为 rsync://user@host/path,它转换为通过 ssh 访问的 rsync 位置 user@host:/path。请注意,路径是绝对路径,相对于主目录。也支持较早的非标准 URI 格式:rsync://user@host:path,它转换为 rsync 位置 user@host:path。
rclone 后端
除了将 rclone 后端添加为 URI 格式为 gcrypt::rclone://remote:subdir 的远程仓库外,还必须将远程添加到 rclone 配置中。通常通过执行 rclone config 来完成。请参见 rclone(1)。
rclone 后端被视为实验性的,仅供早期采用者使用。注意:风险自负。
仓库格式 .................
| EncSign(X): 使用 GPG 密钥持有者签名并加密
| Encrypt(K,X): 使用对称密钥算法加密
| Hash(X): SHA-2/256
|
| B: 分支列表
| L: 每个包文件的哈希 (Hi) 和密钥 (Ki) 列表
| R: 远程 ID
|
| 写入仓库:
|
| 将每个包文件 P 存储为 Encrypt(Ki, P) → P',文件名为 Hi
| 其中 Ki 是一个新的随机字符串,Hash(P') → Hi
| 将 EncSign(B || L || R) 存储在清单中
|
| 读取仓库:
|
| 获取清单,使用 GPG 密钥环解密并验证 →
| 如果 与之前见过的远程 ID 不匹配,则发出警告
| 对于 中的每个 :
| 从服务器获取文件 →
| 验证 是否与 匹配
| 使用 解密 → ,然后用 git 打开
清单文件 .............
示例清单文件(为简洁起见省略部分内容):::
$ gpg -d 91bd0c092128cf2e60e1a608c31e92caf1f9c1595f83f2890ef17c0e4881aa0a
542051c7cd152644e4995bda63cc3ddffd635958 refs/heads/next
3c9e76484c7596eff70b21cbe58408b2774bedad refs/heads/master
pack :SHA256:f2ad50316...cd4ba67092dc4 z8YoAnFpMlW...3PkI2mND49P1qm
pack :SHA256:a6e17bb4c...426492f379584 82+k2cbiUn7...dgXfyX6wXGpvVa
keep :SHA256:f2ad50316...cd4ba67092dc4 1
repo :id:OYiSleGirtLubEVqJpFF
每个项目持续到换行符,并匹配以下之一:
<sha-1> <gitref>
Git 对象 ID 及其引用
pack :<hashtype>:<hash> <key>
包文件哈希 (Hi) 和相应的对称密钥 (Ki)。
keep :<hashtype>:<hash> <generation>
包文件哈希及其重新打包的世代
repo <id>
远程 ID
extn <name> ...
扩展字段,保留但未使用。
要检测一个 git URL 是否为 gcrypt 仓库,使用:git-remote-gcrypt --check url
如果仓库存在且可以解密,退出状态为 0;如果仓库使用 gcrypt 但无法解密,退出状态为 1;如果仓库未使用 gcrypt 加密(或无法访问),退出状态为 100。
请注意,这需要将仓库内容获取到本地 git 仓库中,与使用 gcrypt 仓库时相同。
每次 git 推送实际上都带有 --force。推送前请确保先拉取。
git-remote-gcrypt 可能会在未警告的情况下决定重新打包远程仓库,这意味着您的推送可能会突然花费比预期更长的时间,因为整个历史记录必须重新上传。在网络连接不佳的情况下,此推送可能会失败。
当仓库确实存在,但 git-remote-gcrypt 遇到身份验证、端口或网络连接问题时,它可能会报告仓库“未找到”。
git-remote-helpers(1), gpg(1)
git-remote-gcrypt 的原始作者是 GitHub 用户 bluss。
2013 和 2014 年的实际维护者是 Joey Hess。
自 2016 年以来的当前维护者是 Sean Whitton [email protected]。
本文档和 git-remote-gcrypt 采用相同的许可条款,GPL-3(或 2+);请参阅 git-remote-gcrypt 文件。
.. 本文档使用 rst2man 生成手册页 .. vim: ft=rst tw=72 sts=4
(B, L, R)RLHi, KiHiP'Hash(P')HiKiP'PP