惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
P
Privacy & Cybersecurity Law Blog
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
G
GRAHAM CLULEY
NISL@THU
NISL@THU
K
Kaspersky official blog
Security Latest
Security Latest
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
T
Tor Project blog
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
I
InfoQ
P
Privacy International News Feed
Project Zero
Project Zero
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Martin Fowler
Martin Fowler
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
U
Unit 42
M
MIT News - Artificial intelligence
Latest news
Latest news
I
Intezer
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
The Last Watchdog
The Last Watchdog
Microsoft Security Blog
Microsoft Security Blog
美团技术团队
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
V
Vulnerabilities – Threatpost

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
读:Git 仓库里的隐藏配置文件 - 暗无天日
2026-05-17 · via 暗无天日

原文 系统梳理了 Git 仓库里跟着代码一起提交、影响 Git 和工具行为的特殊文件。.gitignore 大多数人都知道(一个容易踩的坑:它只影响未跟踪的文件,已经跟踪的加进 .gitignore 后仍在仓库里,需要 git rm --cached 移除),但 .gitattributes、.mailmap、.git-blame-ignore-revs 这些你可能见过但没深究过。下面按用途分组,挑出值得了解的。

让 Git 正确处理你的文件

.gitattributes:告诉 Git 怎么对待每个文件

.gitattributes 比 .gitignore 强大得多,它精确控制 Git 对特定文件的处理方式:行尾怎么转换、当二进制还是文本看待、用哪种 diff、冲突时怎么合并。

行尾统一是最常见的用途:

*.sh text eol=lf
*.bat text eol=crlf
*.png binary

text 属性让 Git 提交时把行尾统一为 LF 存进仓库,checkout 时再按 eol 的设定转回来(或保持 LF)。 binary 让 Git 跳过 diff 和合并,直接保留一个版本。

diff 和 merge 也能定制:

*.json diff=json
package-lock.json merge=ours

merge=ours 在合并冲突时保留当前分支的版本,然后在 git config 里定义这个驱动:

git config --global merge.ours.driver true

lock 文件冲突就不用手动解决了。

Git LFS 的文件模式也可以在这里声明:

*.psd filter=lfs diff=lfs merge=lfs

.gitattributes 还能控制 GitHub 的语言统计。GitHub 用 Linguist 自动检测仓库语言占比,但经常会把 vendor 目录和生成代码算进去。在 .gitattributes 里标记就能修正:

vendor/* linguist-vendored
*.gen.go linguist-generated
docs/* linguist-documentation

linguist-vendored 排除第三方代码, linguist-generated 让 diff 默认折叠, linguist-documentation 排除文档。

和 .gitignore 一样,.gitattributes 可以放在子目录中局部生效,也可以放在 .git/info/attributes 里做本地配置。

让团队协作更顺畅

.lfsconfig:Git LFS 的仓库级配置

团队用 Git LFS 时,每个人都要手动配 LFS 服务器地址。.lfsconfig 把这个配置跟着仓库走:

[lfs]
    url = https://lfs.example.com/repo
[lfs "transfer"]
    maxretries = 3

它用 git config 格式,所有人 clone 后自动使用相同的 LFS 设置。LFS 的文件匹配模式仍然在 .gitattributes 里声明( filter=lfs ),.lfsconfig 只管连接和传输参数。

注意,项目中途加 LFS 不会自动迁移已提交的文件,需要跑 git lfs migrate 重写历史。

.mailmap:统一贡献者身份

换过邮箱或拼错过名字的人,在 git log 里会显示成多个不同的人。.mailmap 把它们合并为一个身份。

格式是:左边是你想显示的身份,右边是提交里实际出现的。比如换了邮箱:

Jane Developer <jane@example.com> <jane@old-job.com>

把旧邮箱的提交统一归到新邮箱下。名字拼错了也能改:

Jane Developer <jane@example.com> Jane Dev <jane@example.com>

Git 在 git shortlog -sngit loggit blame 中都会使用这个映射。

有一点要注意:GitHub 的贡献者图表不读 .mailmap,即使你配好了,GitHub 网页上可能还是显示重复。

.git-blame-ignore-revs:让 blame 跳过噪音提交

全仓库跑一次格式化之后, git blame 的输出基本就废了,每行都显示成格式化那次提交。.git-blame-ignore-revs 让 blame 跳过这些噪音提交:

# 跑了 prettier
a1b2c3d4e5f6789012345678abcdef1234567890
# 迁移到 ESLint flat config
b2c3d4e5f60123456789abcdef01234567890123

一行一个 commit SHA, # 开头是注释。配一次就行:

git config blame.ignoreRevsFile .git-blame-ignore-revs

GitHub、GitLab 15.4+ 和 Gitea 会自动读这个文件,不用手动配置。

一个坑:如果在全局 git config 里设了 blame.ignoreRevsFile ,在没有这个文件的仓库里 git blame 会报错。要么每个仓库单独配,要么确保所有仓库都有一个(哪怕是空的).git-blame-ignore-revs。

.gitmessage:提交消息模板

.gitmessage 是提交消息的预填模板:

# <type>: <subject>
#
# <body>
#
# <footer>
#
# Types: feat, fix, docs, style, refactor, test, chore

配好之后,每次 git commit 打开编辑器就自动填入:

git config commit.template .gitmessage

文件跟着仓库走,但 commit.template 配置不跟着走,每个开发者 clone 之后需要自己跑一次 git config commit.template .gitmessage 才能生效。很多团队因此更愿意用 commit-msg hook 来校验格式,而不是靠模板引导。

管理外部依赖

.gitmodules:子模块配置

子模块把其他 Git 仓库嵌进来当依赖用:

[submodule "vendor/lib"]
    path = vendor/lib
    url = https://github.com/example/lib.git
    branch = main

git clone 不会自动拉子模块,需要 git submodule update --init --recursive ,或者 clone 时加 --recurse-submodules

子模块跟踪的是具体 commit,不是版本范围,版本管理不够灵活。忘记更新会造成状态混乱。但对于把第三方源码直接放进仓库(vendor)的场景,或者一个仓库管多个项目(monorepo)只想 checkout 部分目录的场景,子模块够用。

平台与生态扩展

Forge 文件夹

.github/.gitlab/.gitea/.forgejo/.bitbucket/ 不是 Git 的功能,是各平台的约定。里面放 CI/CD 配置、Issue/PR 模板、CODEOWNERS 等,跟着代码走,平台自动识别。

Forgejo 和 Gitea 有回退链,会依次查找:

  • Forgejo: .forgejo/.gitea/.github/
  • Gitea: .gitea/.github/

所以在 GitHub 上用的 .github/ 配置,迁移到 Gitea 后还能直接用。

SourceHut 用 .build.yml.builds/*.yml 做 CI,不用专门的文件夹。

跟着仓库走的其他配置

"在仓库根目录放一个点文件,工具自动识别"这个模式不限于 Git:

  • .editorconfig :跨编辑器统一缩进风格、行尾、字符编码。VS Code 原生支持,Vim 和 Emacs 需要装插件
  • .dockerignore :跟 .gitignore 语法一样,排除 Docker 构建上下文中的文件,加速构建并防止敏感信息进入镜像
  • .ruby-version.node-version.python-version :告诉版本管理工具(rbenv、nodenv、pyenv、asdf)用哪个语言版本, cd 进目录自动切换
  • .jj/ :Jujutsu(一个 Git 兼容的版本控制工具)的工作目录状态,同时尊重 Git 的所有配置文件

顺便一提:.gitkeep

.gitkeep 不是 Git 的功能,只是一个约定。Git 不跟踪空目录,在里面放个文件,Git 就有东西可以跟踪了。文件名是任意的,叫什么都行, .gitkeep 只是大家的习惯。

还有一些不常见的

几个不太常见但特定场景有用的文件:

  • .gitconfig (仓库级):Git 不会自动加载仓库里的 .gitconfig(安全原因),但项目可以附带一个,让开发者手动 git config include.path ../.gitconfig 引入。常见于 monorepo
  • .gitsigners :记录可信的 GPG/SSH 签名密钥,配合 gpg.ssh.allowedSignersFile 使用,Linux 内核项目在用
  • .gitreview :Gerrit 代码审查集成配置,OpenStack、Android 等项目在用
  • .gitlint :gitlint 的配置文件,校验提交消息格式

这些文件做的事情都一样:配置跟着代码走,团队共享同一套规则。