开源项目公开前的信息泄露检查
核心认知
Git 的「删除」只是新增一个记录删除动作的提交,旧版本永远躺在历史里。
git clone→ 拿到完整历史,能翻出每个曾存在的文件版本- GitHub 网页 Download ZIP → 只有当前快照,无历史
GitHub 上一旦推过,就算 force push 覆盖,旧提交的 URL 短期内仍可打开(直到垃圾回收)。所以想彻底纯净,最稳的是:删掉远端仓库 → 新建空仓库 → 只推干净提交。
六个泄露点(按被忽略频率排序)
1. Git 作者邮箱 ? 最容易漏
每个提交都带 user.email,与文件内容无关,属于提交元数据。别人 git log 或点 GitHub Commits 页面直接可见。
# 检查(只看分类,不打印值)
git log --all --format='%ae' | sort -u
对策:用 GitHub 提供的 noreply 邮箱,作者名用网名而非真名。
git config user.email "你的ID+用户名@users.noreply.github.com"
2. 本机绝对路径与系统用户名
内部交接文档、构建脚本、README 里的 C:\Users\<用户名>\...,会暴露系统账号名和本机目录结构。
git grep -lEI 'C:\\Users\\|/home/|/Users/' $(git rev-list --all)
3. 凭据与 .env
授权码、API key、密码硬编码或误提交配置文件。
git grep -lEI 'password[[:space:]]*[:=][[:space:]]*"[^"]{6,}"|api[_-]?key|secret' $(git rev-list --all)
对策:真实配置放系统凭据存储(Windows 凭据管理器 / macOS Keychain),.gitignore 排除 .env*。
4. IDE 与草稿目录
.idea/、.vscode/、开发笔记目录。含本机路径,且对外无价值。
.idea/
.vscode/
.scratch/
5. 代码注释与提交说明里的真人信息
真实姓名、私人邮箱、内部系统名、同事名字。
6. 缺 LICENSE(不是泄露,但是公开协作硬需求)
没有许可证 = 默认版权保留,别人不能放心用也不能放心改。常见 MIT(最宽松)或 GPL。
公开前操作清单
□ 作者邮箱换成 noreply
□ 扫全历史:路径 / 凭据 / 邮箱
□ 删除内部交接、调研类文档
□ .gitignore 补 IDE 与草稿目录
□ 加 LICENSE
□ README 重写(对外口径,非开发笔记)
□ 做成单一初始提交
□ 远端仓库删除重建后再推
两种公开方式
| 方式 | 做法 | 适用 |
|---|---|---|
| 纯净快照 | orphan 分支压成单提交,旧历史不公开 | 提交少、历史含草稿、首次公开 |
| 保留历史 | git filter-repo 逐层抠掉脏文件 |
历史有阅读价值(设计演进、踩坑记录) |
首次公开推荐前者。
纯净快照具体做法
# 1. 建无历史的分支
git checkout --orphan public
# 2. 全部文件作为单一初始提交
git add -A
git commit -m "初始提交"
# 3. 推成远端默认分支
git push -u origin public:main
推完切回原分支继续开发,public 只在发版时重新压一次覆盖上去。开发历史留本地,公开的永远是干净快照。
验证纯净分支
git ls-files | wc -l # 文件数是否合理
git ls-files | grep -cE '^\.(scratch|idea)/' # 应为 0
git ls-files | xargs grep -lI '你的系统用户名' # 应为空
在 GitHub 上翻提交记录
- 仓库首页文件列表右上角带时钟图标的链接(写着提交数)
- 或直接改地址栏:
https://github.com/<用户>/<仓库>/commits/main - 单文件历史:打开文件后右上角 History
- 本地更快:
git log --oneline --stat