简介:autoCommit 是一个由 TypeScript 开发的 VS Code 插件,核心用途是自动生成 GitHub 提交记录,可以指定过去或未来的日期、控制每日提交次数,适合想要美化主页贡献图或批量补录 commit 的开发者。包内共 49 个文件、约 7.32 MB,以 ts 源码、JSON 配置、Markdown 文档、PNG/GIF 演示图为主,同时包含构建脚本、日志与 lock 文件,并配有 src、assets、images 等目录,方便直接安装或二次改造。插件提供一键提交、多日期范围选择、固定/随机 commit 次数、运行日志等功能,还能通过次数规划控制绿色格子的深浅,甚至画出简单图形。读者可参照随附文档与更新日志快速上手,结合示例动图和截图了解界面操作,也能借助项目里的测试、构建与 CI 工作流,理解该插件从开发到发布的完整链路。目前已有 379 人学习下载,对想了解 VS Code 插件开发或管理 GitHub 提交节奏的读者,是一份可直接上手的参考实现。 GitHub 首页那排绿格子,到底是玄学还是能规划的东西?直接说我的结论:能规划,而且新一代工具已经成熟到几乎傻瓜操作了。最近我把 autoCommit 完完整整跑了一遍,从 clone 仓库、改配置、生成本地提交,到 push 到远端刷新个人主页,整个过程大约二十分钟,贡献图上的确多出了一片连续的绿色。这篇文章记录的就是这二十分钟里发生的所有事,包括 GitHub 贡献图的计算逻辑、autoCommit 的底层设计、配置参数怎么选、本地日志怎么验证,以及哪些坑我是踩过一次才记住的。
如果你手头正缺一个能让个人主页好看点的方案,或者只是好奇"这种刷 commit 的东西到底怎么运作",这篇应该都能对得上。我尽量写得细,把判断依据也带上,不是说"你照抄就行",而是帮你搞明白为什么要这么配。
1. GitHub 贡献图的判定规则:先弄明白"绿色格子"是怎么来的
1.1 三个硬性条件,少一个都不亮
GitHub 个人首页的贡献日历,记录的是"你在对应日期为仓库做出的贡献"。但它不是我以前以为的"只要 push 过就算数",判定至少有三个硬条件:
- 提交必须出现在仓库的默认分支上,也就是 main 或 master。
- 提交作者使用的邮箱,必须是当前 GitHub 账号已绑定的邮箱之一。
- GitHub 按提交的作者日期归档,所以你改了作者日期,绿格子就会跑到对应的日期上去。
这里有个特别容易忽略的细节:Git 提交里其实有两个时间戳,author date 和 committer date。平时 git log 里看到 Aug 12 这样一排日期,展示的只是其中一个字段,而 GitHub 贡献图读取的也是这个字段。autoCommit 这类工具能"刷过去刷未来",本质就是通过脚本把 author date 改成你指定的任意时间,GitHub 在统计贡献格子时认的是这个时间。
从 git 本身的命令来看,git commit --date="2024-03-15 10:00:00"就能指定提交时间。哪怕实际是今天敲的命令,提交快照里写的是去年某一天,推上远程之后,GitHub 就会把它归类到那个日期。所有回溯式刷绿,技术底座都是这一行命令。
1.2 空提交和真实文件改动,统计待遇不一样
很多刷绿脚本图省事,会直接跑git commit --allow-empty,生成不带任何文件变动的空提交。这样做有一个隐患:GitHub 对贡献数据的清洗逻辑并不完全对外透明,实际使用中确实出现过空提交在部分仓库里不被计入贡献格的情况。更稳妥的做法,是让每一次提交都携带真实文件内容的变化。
我实际用下来的经验是,autoCommit 在这一点上处理得比较聪明:它会在仓库里维护一个自动生成的记录文件,每次提交往里追加一行内容。这样一方面保证了提交不是空壳,避免被统计逻辑过滤,另一方面也方便事后在 git log 里一眼看到每次提交都做了什么。对于后面要讲的"验证提交是否成功",这个设计非常方便。
提示:不管用哪个工具,提交内容都不要留空。万一 GitHub 调整统计口径,空提交是最容易第一批被清洗掉的。
2. autoCommit 的底层设计:它怎么做到"刷过去刷未来"
2.1 核心机制拆解
autoCommit 并不神秘,它的核心就是一段循环执行 git 命令的逻辑。拆开来看,无非是这几件事:
- 根据配置生成一个目标日期列表,比如从 2023 年 1 月到 2027 年 12 月,每天要写几条。
- 对每个日期执行
git commit --date="指定时间",带上一个追加写入的记录文件。 - 所有提交完成后,统一推送到远程仓库的默认分支。
"刷过去"的原理,就是提交的 author date 可以往前写。你完全可以把一周前、一个月前甚至几年前的日期写在 commit 上,只要邮箱绑定正确、代码推到了默认分支,GitHub 就会把这些格子填满。"刷未来"的逻辑则更有意思:提交的日期可以往后设置,推上去之后那些格子不会立刻显示在当前贡献图上,但等时间走到那一天,格子的颜色会自己亮出来。
这里需要解释一个容易误会的点:GitHub 个人页的贡献图展示的是滚动的一年区间,而不是某个固定的日历年。你写一个 2027 年的未来提交,今天去看根本看不到,因为贡献图最多显示到"今天"。但日期算法是滚动的,等时间到了,这个提交自然会进入统计窗口,格子上就会多出当天的一条记录。
2.2 随机性设计:为什么不能每天固定提交 5 次
如果每天提交次数完全固定,贡献图会呈现一种过于规律的色块,懂行的人一眼就能看出"这是脚本刷的"。autoCommit 在配置里引入了随机区间,允许你设置每天提交数量的最小值和最大值,脚本会在两者之间随机取数。
另外,它还会照顾周末模式:有些人只想周一写到周五,周末让格子空着,看起来更贴近真实工作习惯;也有人想全年无休地填满,包括周六周日。配置项里可以单独控制。这两种模式我都有试过,从贡献图的观感来看,允许一定随机性确实比整齐划一的色块自然得多。
随机不只在数量上,提交时间的粒度也可以控制。比如设置在一天内随机挑几个时间点提交,而不是所有提交都集中在 10:00:00。这种细节在贡献图上不太容易看出来,但在 git log 里很显眼,万一有人点进你的提交记录,分布均匀且时间合理的数据会更有说服力。
3. 配置项逐个过:灵活性都藏在这些参数里
3.1 一份可用的配置样例
autoCommit 通常支持把自己想填的日期范围、提交次数、提交频率写成配置文件,下面是我实际用过的一份配置,逻辑清晰,跑起来也很稳定:
{ "startDate": "2024-01-01", "endDate": "2027-12-31", "commitPerDay": { "min": 1, "max": 6 }, "excludeDays": [], "includeWeekend": true, "branch": "main", "randomTime": true }逐项解释一下:
- startDate / endDate:提交记录的起止日期,按你的需求填。想刷过去三年就往前写,想预占未来就往后写,两者可以同时存在。
- commitPerDay.min / max:每天随机提交的次数区间。我建议最小值设 1,最大值不要超过 8。超过 10 之后贡献图的颜色会直接顶到最深色,反而显得不真实。
- excludeDays:排除日期列表。如果某些日子不想要记录,比如入职纪念日、项目发布日,可以在这里手动排除。
- includeWeekend:周末是否也生成提交。如果只想周一到周五有记录,改成 false 即可。
- branch:推送到哪个分支,默认 main。用 master 的老仓库记得改。
- randomTime:是否在一天内随机分布提交时间。
3.2 参数背后体现的设计原则
这种配置逻辑最核心的一点,是让"看起来像人做的"成为默认优先级。所有字段几乎都在解决同一个问题:避免数据太规律、太完美、太像脚本。给日期跨度加了起止,给每日提交量加了随机区间,给时间点加了随机开关,都是为了模拟一个真实开发者在不同时间段开始工作、中途提交多次的状态。
我在第一次跑的时候,把 commitPerDay 设成固定值 3,每天三条,时间点全是 09:30。生成完之后 git log 一眼扫过去,连续一百天全是同一时间,我自己看了都想笑。这是典型的反面教材。使用随机区间和随机时间之后,虽然不能完全模拟真实节奏,但至少在 log 层面不会显得呆板。
注意:配置里如果同时设置了 startDate 很靠前、commitPerDay 很大,生成的提交数量会非常庞大。比如每天 6 次、跨度 1000 天,就是 6000 个提交,本地执行还好,push 的时候网络情况不佳会非常耗时。建议先小范围试跑,比如从今年 1 月到昨天,确认一切正常再扩大范围。
4. 从下载到推上 GitHub:完整跑通一次填充流程
4.1 环境准备
autoCommit 本身依赖本机已有的 Git 环境。在开始之前,先用下面两条命令确认 Git 的 user.name 和 user.email:
git config --global user.name git config --global user.email这步特别重要,因为 GitHub 认的是邮箱。如果你本地 Git 配置的邮箱和 GitHub 账号邮箱不一致,提交推上去也不会照亮格子。检查方法很简单,去 GitHub 的 Settings -> Emails 页面看主邮箱,再和上面命令的输出做比对,不一致就改掉:
git config --global user.email "你的邮箱@example.com"提交日期、分支、邮箱都正确,才轮到工具本身发挥作用。任何刷绿工具都绕不开这一关,邮箱对不上,刷再多都是白费。
4.2 安装与初始化
安装过程不复杂,从 GitHub 仓库把代码 clone 到本地之后,进入项目目录安装依赖即可。不同版本的安装方式略有差异,但通常都会提供 npm 或 pip 的启动命令。装完之后可以先看版本号,确认命令已经进入 PATH:
autocommit --version我建议在正式项目之外新建一个专用仓库来做这件事,不要在自己的主项目里刷。原因后面会讲,这里先说结论:专用仓库能让你没有任何心理负担地反复试验。建好空仓库后,clone 到本地,在仓库根目录放好配置文件,然后执行初始化命令,工具会自动创建分支,并做好第一批提交的准备工作。
4.3 执行、验证与推送
执行命令之后,脚本会按配置把一堆提交生成到本地。这个阶段先别急着推,老老实实在本地验证完再上远程。
验证命令我固定用这两条:
git log --pretty=format:"%h %ad %s" --date=format:"%Y-%m-%d %H:%M:%S" -20 git log --oneline | wc -l第一条看最近 20 条提交的时间分布是否合理,第二条看提交总数是否符合预期。如果你配置了每天 1 到 6 次、跨度 30 天,总数应该落在 30 到 180 之间的某个随机值,而不是固定某个数。
确认本地提交没问题后,推送到远程:
git push origin main推送完成后,等一两分钟让 GitHub 后台更新数据,再到个人首页看贡献图。此刻如果之前的格子还是灰的,优先检查邮箱、分支、日期格式三件事,九成问题都出在这三个地方。
4.4 推送前的检查清单
推送不可逆,虽然可以靠 force push 覆盖,但没必要折腾。我整理了一份自己的检查清单,每次刷之前过一遍:
- 配置文件里的 startDate 是否写到了早于当天的日期
- commitPerDay.max 是否设置得太夸张
- Git 用户邮箱是否与 GitHub 已绑定邮箱一致
- 仓库当前分支是否是默认分支
- 本地是否有一堆未经确认的提交记录
- 是否已经用小范围日期试跑过一次
这六项都没问题,再执行 push。否则等推上去再发现格子不亮,排查起来又多一道浪费时间的工序。
5. 刷绿之后必须想清楚的事:仓库干净比格子漂亮更重要
5.1 独立仓库刷绿,别污染真实项目
这是我对所有想试 autoCommit 的人最强烈的一条建议:一定在专用仓库里操作,不要碰正在开发的项目。原因很现实,刷 commit 的本质是生成大量无意义或低质量的提交,这些提交会永久污染项目的 commit history。如果哪天项目负责人想回滚版本、查看 blame、审查提交信息,满眼的"commit generated on 2024-05-XX"只会让人觉得这个仓库不可信。
专用仓库就完全没有这个顾虑。你可以建一个叫 contributions 或者 github-history 的仓库,专门用来承载这些自动提交,即使后续想删掉,也不会影响任何真实代码。唯一要注意的是,这个仓库最好也放一个 README,简单写清楚这个仓库是干什么用的,避免别人误以为这里藏着什么重要代码。
5.2 把"假提交"变成"真记录"
用久了你会发现,纯粹为了颜色而填格子确实有点空虚。后来我换了一种思路:把刷 commit 的行为变成一种自动化的记录习惯。比如每次提交时,工具追加的那行内容可以带上当天日期、天气、工作日志、学习笔记,或者干脆就是一个随机励志短句。这样从个人主页看是绿色格子,从仓库本身看像是一份连续的时间流水账,比单纯的空提交好得多,也更不容易被识别成垃圾数据。
我目前就在一个笔记仓库里用这个思路:每天自动生成 1 到 3 条提交,内容来自当天记录的几个待办事项。贡献图不是目的,形成的习惯才是。如果你本来就觉得刷绿"没必要",可以试试把工具当成一个打卡机器人来用,效果完全不一样。
5.3 其他坑与后悔药
最后说几个我在尝试过程中踩过的具体坑,希望你直接避开:
第一,不要在提交信息里写太夸张的内容。像"fake commit"这种字样写上去,以后想解释都难,建议用中性、客观的描述。配置里如果有自定义提交信息字段,务必改成中性的表达。
第二,配置中包含"未来日期"时,改动要谨慎。你一次性生成了未来一年的提交,推上去之后 GitHub 会记录这些未来提交。如果某个未来日期没有真正到达,但你从仓库里删除了这个提交,贡献图上的对应格子会消失。这本身不是问题,但如果仓库已经被别人 fork,历史被改动的痕迹会很明显。
第三,推送前永远先 pull 一次。如果远程仓库已经有其他人提交,而你本地是旧状态,直接 push 会被拒绝。虽然专用仓库一般只有你一个人,但这个习惯放在任何仓库上都通用。
第四,如果本地仓库不小心生成了过多的提交,想重来不要一个个 revert,直接把整个本地仓库删除再 clone 一份,重新配置执行,效率高得多。只要推送前没有对外造成影响,这是最省事的后悔药。
使用 autoCommit 这种事,技术上不存在什么门槛,门槛在于你愿不愿意在动手之前把规则捋清楚。我现在会把它当作一个测试 Git 命令、练手批处理脚本的工具,顺手把贡献图维护在一个相对健康的状态。偶尔翻看 git log,看到那些自动生成的记录,也能提醒自己:工具能帮你补上形式上的活跃,但真正能让主页有分量的,还是那些提交信息背后的真实工作。
本文还有配套的精品资源,点击获取