Darcs 2.18.5 配置参数详解
Darcs 2.18.5 配置详解:用户级 ~/.darcs/defaults 与仓库级 _darcs/prefs/*(defaults/boring/binaries/motd/prefs/defaultrepo/repos)的优先级与实测,14 个环境变量(颜色、TMPDIR、EDITOR、SSH、连接超时)、远程 URL 与 ~/.ssh/config、全局缓存,含 8 项实测回显与排障实录。
Darcs 2.18.5 配置参数详解
目标:把 Darcs 的四层配置讲透——用户级
~/.darcs/、仓库级_darcs/prefs/、环境变量、命令行参数,并给出 8 项在本机实测生效的配置及其原样回显。所有命令在 Ubuntu 22.04.5 + Darcs 2.18.5 上执行,测试仓库/root/lab/repoA,作者admin <admin@example.com>。
一、配置分层与优先级
| 层级 | 位置 | 作用范围 | 典型内容 |
|---|---|---|---|
| 用户级 | ~/.darcs/defaults、~/.darcs/author | 当前用户所有仓库 | 默认命令选项、作者 |
| 仓库级 | _darcs/prefs/defaults、prefs、boring、binaries、motd、defaultrepo、repos、sources、author | 单个仓库 | 仓库默认选项、忽略/二进制规则、公告、默认远端 |
| 环境变量 | Shell 环境 | 当前进程 | 编辑器、分页器、颜色、临时目录、SSH 客户端 |
| 命令行 | darcs <cmd> ... | 单次调用 | 最高优先级,覆盖以上全部 |
实测优先级:仓库级 defaults > 用户级 defaults。将 ~/.darcs/defaults 写 log --last 2、_darcs/prefs/defaults 写 log --last 1,执行 darcs log | grep -c '^patch ' 输出 1,证明仓库级覆盖用户级。命令行再传 --last 5 则以 5 为准。
二、用户级 ~/.darcs/
2.1 defaults 文件格式
每行一条「命令名 + 选项」,# 开头为注释。命令名用长名(record、log、push),不要带 darcs 前缀。
mkdir -p ~/.darcs
cat >> ~/.darcs/defaults <<'EOF'
record --author "ops <ops@example.com>"
log --last 1
EOF
实测记录一个补丁:
darcs record -a -m 'defaults demo'
darcs log
Finished recording patch 'defaults demo'
patch 575ec37f203fc97ee6e06ea1a28195af87ebcd83
Author: "ops <ops@example.com>"
Date: Tue Oct 27 12:32:47 UTC 2026
* defaults demo
两个结论:
record --author生效,作者被改成 ops;- 双引号被原样写入作者字段,日志显示
Author: "ops <ops@example.com>"。正确写法是不加引号:record --author ops <ops@example.com>(尖括号与空格在 defaults 文件中按行解析,不需要 shell 引号)。
log --last 1 同时生效——darcs log 只输出最近 1 条。测试后记得删除该文件,避免影响后续排查。
2.2 author 文件
~/.darcs/author 每行一个作者串;record 未指定 --author 时按 --author → _darcs/prefs/author → ~/.darcs/author → $DARCS_EMAIL/$EMAIL 顺序查找,都没有才交互询问。实测内容:
admin <admin@example.com>
三、仓库级 _darcs/prefs/
实测目录内容(初始化后按需生成):
binaries
boring
defaultrepo
repos
3.1 _darcs/prefs/defaults
只对本仓库生效,格式与用户级一致。实测写入 whatsnew --summary 后:
echo 'whatsnew --summary' > _darcs/prefs/defaults
darcs whatsnew
M ./hello.txt +1
原本逐行 hunk 的输出变成单行摘要。该文件适合放「本仓库特有」的默认行为(例如统一 --test、--ignore-times),不要放个人作者信息。
3.2 _darcs/prefs/boring(忽略规则)
每行一个 POSIX 扩展正则(不是 glob)。测试时先踩了坑:
echo '*.o' > _darcs/prefs/boring
touch foo.o
darcs whatsnew
Warning: Ignored invalid boring regex: *.o
No changes!
*.o 在正则里是非法表达式(* 前缺原子),Darcs 打印警告并忽略该行。正确写法:
printf '.*\.o$\n' > _darcs/prefs/boring
touch foo.o
darcs whatsnew
No changes!
foo.o 被正确忽略。规则按仓库生效,等价于 Git 的 .gitignore,但语法是正则,写 glob 会静默失效(只在首次加载时告警)。
3.3 _darcs/prefs/binaries(二进制规则)
同样使用 POSIX 正则。实测把 .*\.png$ 加入后,修改图片文件不再尝试逐行 diff:
printf '.*\.png$\n' > _darcs/prefs/binaries
printf '\x89PNG\r\n\x1a\n2222' > logo.png
darcs whatsnew
binary ./logo.png
若不配置该文件,Darcs 会把 PNG 当文本做行级差异,既慢又可能产生巨大 hunk。二进制文件应当在 add 之前就配好规则。
3.4 _darcs/prefs/motd(仓库公告)
写入任意文本,在他人 clone/pull 该仓库时显示(本仓库内执行普通命令不显示):
echo '== repoA maintenance window ==' > _darcs/prefs/motd
cd /root/lab && darcs clone repoA repoM
== repoA maintenance window ==
**********************
Copying patches, to get lazy repository hit ctrl-C...
Finished cloning.
适合放维护窗口、迁移通知、只读提示。
3.5 _darcs/prefs/prefs(仓库偏好键值)
由 darcs setpref 维护,格式为 键 值。实测设置 test:
darcs setpref test 'echo TEST-RAN'
cat _darcs/prefs/prefs
test echo TEST-RAN
test 是提交前测试脚本,只有加 --test(或在 defaults 里配 record --test)才会执行。实测把脚本改成 exit 1 后:
darcs record -a --test -m 'test pref demo'
Running test...
Test failed!
ExitFailure 1
Failed to record patch 'test pref demo'
补丁被正确拒绝入库。清空用 darcs setpref test ''。
3.6 _darcs/prefs/defaultrepo 与 repos
defaultrepo 保存默认远端,由 --set-default 写入。实测指向 SSH 仓库:
darcs push -a --set-default ssh://darcs-lab//root/lab/repoM
cat _darcs/prefs/defaultrepo
darcs push -a
ssh://darcs-lab//root/lab/repoM
Pushing to "ssh://darcs-lab//root/lab/repoM"...
No recorded local patches to push!
repos 记录本仓库交互过的远端清单,实测内容:
/root/lab/repoB
ssh://darcs-lab//root/lab/repoM
/root/lab/repoD
该文件由 Darcs 自动维护,不建议手改;sources 在部分传输路径下才会生成,本次测试未出现,属正常现象。
3.7 _darcs/prefs/author 与 tmpdir
author:仓库级作者,优先级高于~/.darcs/author;tmpdir:仓库级临时目录,优先级低于$DARCS_TMPDIR、高于系统/tmp。
四、环境变量
darcs help environment 是权威清单。常用项与实测结论:
| 变量 | 作用 | 实测/说明 |
|---|---|---|
DARCS_EDITOR / VISUAL / EDITOR | 编辑补丁描述 | 依次回退;都未设时用 nano,再退 vi/emacs |
DARCS_PAGER / PAGER | 分页器 | 设为空字符串可禁用分页(本文所有回显均 DARCS_PAGER=) |
DARCS_ALWAYS_COLOR | 强制 ANSI 颜色 | 实测 DARCS_ALWAYS_COLOR=1 输出 ^[[36mpatch ...^[[00m |
DARCS_DONT_COLOR | 关闭颜色 | 实测输出无任何转义序列 |
DARCS_ALTERNATIVE_COLOR | 用加粗/反显替代彩色 | 适配单色终端 |
DARCS_DONT_ESCAPE_ANYTHING | 关闭控制字符转义 | 管道给自定义分页器时使用,注意安全风险 |
DARCS_TMPDIR / TMPDIR | 临时目录 | 实测 DARCS_TMPDIR=/root/dtmp,darcs diff 生成 darcs-diff-2d0bbc84248415c9 |
DARCS_KEEP_TMPDIR | 保留临时目录 | 与上者配合,便于排查 test 脚本失败 |
DARCS_EMAIL / EMAIL | 作者串回退 | 优先级低于 author 文件 |
DARCS_SSH | 替换 ssh 客户端 | 见第五节实测异常 |
DARCS_SCP / DARCS_SFTP | 替换 scp/sftp | DARCS_SCP=rsync 可加速 clone |
SSH_PORT | 非 22 端口 | 推荐改用 ~/.ssh/config 的 Port |
DARCS_CONNECTION_TIMEOUT | 连接超时秒数 | 默认 30,仅 curl 传输生效 |
DARCS_SLOPPY_LOCKS | 宽松锁 | NFS 等文件系统报 atomic_create 时尝试 |
颜色实测:
env -u DARCS_DONT_COLOR DARCS_ALWAYS_COLOR=1 TERM=xterm script -qec 'darcs log --last 1' /dev/null | cat -v
^[[36mpatch ^[[00m^[[36m641189546e693b0a69dd4efddab0c131deadb333^[[00m^[[00m
Author: admin <admin@example.com>^[[00m
临时目录实测:
mkdir -p /root/dtmp
DARCS_TMPDIR=/root/dtmp DARCS_KEEP_TMPDIR=1 darcs diff --last 1 >/dev/null
ls /root/dtmp
darcs-diff-2d0bbc84248415c9
五、远程仓库 URL 与 SSH
5.1 URL 写法
| 写法 | 示例 | 说明 |
|---|---|---|
| 本地路径 | /root/lab/repoA、../repoB | 最快,用于本机/挂载盘 |
| SSH 简写 | darcs-lab:/root/lab/repoA | 走 ~/.ssh/config 的 Host 别名 |
| SSH URL | ssh://darcs-lab//root/lab/repoA | 双斜杠,第二个才是绝对路径开头 |
| HTTP(S) | https://host/repo | 只读拉取为主 |
5.2 SSH 配置与实测
~/.ssh/config:
Host darcs-lab
HostName 127.0.0.1
User root
IdentityFile /root/.ssh/id_ed25519
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
两种写法均克隆成功:
darcs clone darcs-lab:/root/lab/repoA repoSSH
darcs clone ssh://darcs-lab//root/lab/repoA repoSSH2
Copying patches, to get lazy repository hit ctrl-C...
Finished cloning.
单斜杠会失败(重要):
darcs clone ssh://darcs-lab/root/lab/repoA repoSSH
Not a repository: ssh://darcs-lab/root/lab/repoA:
The program "scp -- darcs-lab:root/lab/repoA/_darcs/format ./darcs98281-1" failed with error: ...
scp: root/lab/repoA/_darcs/format: No such file or directory
单斜杠被当作 URL 分隔符吃掉,远端路径变成相对路径 root/lab/...。要么用 host:/abs/path,要么 ssh://host//abs/path。
5.3 DARCS_SSH 实测异常
按文档 DARCS_SSH 应可替换 SSH 客户端,但实测:
DARCS_SSH=/bin/false darcs clone darcs-lab:/root/lab/repoA /root/lab/failclone2
Copying patches, to get lazy repository hit ctrl-C...
We have conflicts!
Affected paths:
./hello.txt
克隆仍然完成,说明该变量未拦截 2.18.5 的 transfer-mode/scp 回退路径。生产环境请用 ~/.ssh/config 管理别名、端口与密钥,不要依赖 DARCS_SSH 做访问控制。
六、缓存
Darcs 有两级缓存:
- 全局缓存:
~/.cache/darcs/(实测 3.3 MB,分inventories/、patches/、pristine.hashed/,桶式两级目录); - 仓库缓存:
_darcs/内部,darcs show repo会显示Cache: thisrepo:..., cache:/root/.cache/darcs。
清理与迁移:
darcs optimize cache
Migrating global cache to bucketed format.
Done making bucketed cache!
Done cleaning global cache!
说明:Darcs 2.18.5 没有 darcs cache 子命令(执行报 No such command 'cache'),缓存操作统一走 darcs optimize cache。缓存目录随 $HOME 变化,用 systemd 或 cron 跑 Darcs 时要确保 HOME 正确,否则缓存会落到 /root 或空目录。
七、推荐配置模板
~/.darcs/defaults:
# 提交时跑测试;作者从 ~/.darcs/author 读取
record --test
# 日志默认显示最近 20 条
log --last 20
_darcs/prefs/boring:
.*\.o$
.*\.pyc$
^dist/
^\.stack-work/
_darcs/prefs/binaries:
.*\.(png|jpg|gif|zip|gz|pdf)$
~/.ssh/config:
Host darcs-prod
HostName git.example.com
Port 2222
User deploy
IdentityFile ~/.ssh/id_ed25519
八、排障实录
1)*.o 写进 boring 完全不生效
回显 Warning: Ignored invalid boring regex: *.o,随后照常显示变更。改用 .*\.o$。同理 binaries 也必须写正则。
2)defaults 里加了引号,作者字段带引号
record --author "ops <ops@example.com>" 会把引号一起存进作者,日志显示 Author: "ops ..."。去掉引号即可。
3)用户级 defaults 改了没反应
先看仓库是否有 _darcs/prefs/defaults——仓库级优先。用 darcs log --last 5 直接覆盖验证。
4)SSH URL 单斜杠导致 scp: No such file or directory
改用 host:/abs/path 或 ssh://host//abs/path;同时确认远端 darcs 在非交互 PATH 中(ssh host 'which darcs')。
5)DARCS_SSH 设了不生效
见 5.3。改用 SSH 配置文件;若要做访问控制,在 sshd_config 的 command=/AuthorizedKeysCommand 层做,而不是客户端变量。
6)缓存不增长/找不到
检查运行用户的 HOME 与 ~/.cache/darcs;darcs show repo 的 Cache: 行是实际路径。批量任务/定时任务里常见 HOME=/ 导致缓存落错位置。
九、验收清单
darcs show repo # 看 Format / Cache / PatchIndex
cat _darcs/prefs/defaultrepo # 默认远端
darcs optimize cache # 缓存可清理
darcs help environment | head -20 # 环境变量清单
配置改完务必用一个临时仓库回归一次 record → log → push,避免 defaults 语法错误影响团队提交。下一篇:《Darcs 2.18.5 常用 CLI 命令详解》。