延迟提交工具:工作时间代码推送解决方案
开发者创意工具:允许在工作时间编辑代码,自动延后到非工作时间才提交。解决职场协作的小痛点。
开发者创意工具:允许在工作时间编辑代码,自动延后到非工作时间才提交。解决职场协作的小痛点。
想象一下:我正坐在一场技术面试中,对自己目前为止的回答还颇有信心。随后,面试官扫了一眼我的 GitHub 主页,问了一个看似无伤大雅的问题:
“我注意到你大多在工作时间 push 代码。能介绍一下你的开发工作流吗?”
这并不是因为我做错了什么,而是因为我突然意识到,commit 时间戳竟然会暴露如此多的工作习惯。那一刻,我明白了:我的 GitHub 贡献图展示的不只是编码活动,它还在无意间向全世界公开我的工作时间。
这个面试问题让我开始思考:如果开发者希望更好地控制 commit 显示的时间呢?
作为开发者,我们生活在一个高度透明的世界里。GitHub 主页是我们的简历,贡献图是我们的绩效指标,commit 历史则像一本摊开的书。但有一个令人不太舒服的事实:
工作与生活的边界正在模糊:凌晨 2 点的那个绿色方块?可能只是因为你终于修复了那个 bug,但在某些雇主眼中,它传递的信号却是“随时在线”。
时区造成的误解:人在亚洲工作,却在申请欧洲公司的职位?你的 commit 时间可能会让招聘人员觉得奇怪。
隐私问题:并不是所有人都希望自己的日常作息暴露在全世界面前。
无意识偏见:有些人评判生产力时,看的是 commit 发生的时间,而不是其中包含的内容。
那次面试之后,我决定为此做点什么。于是,我为自己的 AI commit message 生成工具 GoCommit 开发了 Delayed Commit 功能。
这个概念简单却很实用:阻止你在自己设定的工作时间内创建 commit,并允许你将 commit 安排到稍后的时间。
你可以配置自己的“受限时段”(例如上午 9 点至下午 5 点)。
当你尝试在这个时段内 commit 时,GoCommit 会拦截这次操作。
随后会出现一个友好的 UI,为你推荐其他时间。
你可以选择一个时间,也可以输入自定义时间。
最终,你的 commit 会使用所选的时间戳创建。
不需要脚本,不需要手动输入 git 命令,也不必再手忙脚乱地处理 --date 参数。整个体验流畅而且高度集成。
构建这个功能的过程非常有趣。下面是它在底层的工作方式:
func isTimeInRestrictedRange(currentTime time.Time, config DelayedCommitConfig) (bool, time.Time, error) {
hour := currentTime.Hour()
if hour >= config.RestrictedStartHour && hour < config.RestrictedEndHour {
// Calculate when restrictions end
endTime := time.Date(
currentTime.Year(), currentTime.Month(), currentTime.Day(),
config.RestrictedEndHour, 0, 0, 0, currentTime.Location(),
)
return true, endTime, nil
}
return false, time.Time{}, nil
}
系统会从受限时段结束的时间开始,按照可配置的时间间隔生成建议的 commit 时间,默认间隔为 20 分钟:
┌──────────────────────────────────────────────────────────┐
│ Commit during work hours (09:00-17:00) detected │
│ Current time: 14:30 │
│ │
│ Select commit time: │
│ → 17:20 (5:20 PM) - Today │
│ • 17:40 (5:40 PM) - Today │
│ • 18:00 (6:00 PM) - Today │
│ • 18:20 (6:20 PM) - Today │
│ • Enter custom time... │
│ │
│ ↑↓: Move Enter: Select Esc: Use current time anyway │
└──────────────────────────────────────────────────────────┘
实际上,Git 原生就支持自定义时间戳!关键在于同时使用 --date 参数和 GIT_COMMITTER_DATE 环境变量:
func executeDelayedCommit(message string, timestamp time.Time) *exec.Cmd {
dateStr := timestamp.Format(time.RFC3339)
cmd := exec.Command("git", "commit", "-m", message, "--date", dateStr)
cmd.Env = append(os.Environ(),
fmt.Sprintf("GIT_COMMITTER_DATE=%s", dateStr))
return cmd
}
这样可以确保 author date(代码编写时间)与 committer date(commit 记录时间)都与你选择的时间一致。
自从实现这个功能以来,我发现了几个合理的使用场景:
有些开发者希望将个人项目与工作时间区分开来,但又不想真的改变自己的编码时间。
远程工作者可以让自己的贡献显示在雇主所在时区的“正常”工作时间内。
有些自由职业者不希望客户追踪自己的确切工作时间。
说实话,有些人只是想让贡献图看起来更漂亮。这也完全没问题!
有时你会离线编写代码,或者忘记及时 commit。能够设置准确的时间戳,有助于保留一份真实可信的历史记录。
现在,我知道你在想什么:“这难道不是……不诚实吗?”
我的看法是:Git 时间戳一直都很灵活。你可以手动设置时间戳,可以通过 rebase 修改,也可以使用各种工具调整历史记录。这个功能并没有带来什么全新的能力,只是让一种已有能力变得更易用、更友好。
真正的问题是:你的编码时间表应该成为公开信息吗?
我认为不应该。你作为开发者的价值来自:
代码的质量
解决问题的能力
协作与沟通能力
工作所产生的影响
而不是你究竟在下午 2 点还是凌晨 2 点 push 了代码。
这个工具可以帮助你掌控外界如何看待你,同时又不需要撒谎。代码依然是你写的,commit 依然是你创建的——你只是选择了它们在历史记录中显示的时间。
想试试看吗?下面是配置 GoCommit Delayed Commit 的方法:
# Linux/macOS
curl -sSL https://raw.githubusercontent.com/thanhphuchuynh/gocommit/main/install.sh | bash
# Or download from releases
# https://github.com/thanhphuchuynh/gocommit/releases
GoCommit 使用 AI 生成 commit message,因此你需要一个 API key:
gocommit --config
你可以选择 Google Gemini 或 OpenRouter,后者能够让你使用 Claude、GPT-4、Llama 等模型。
gocommit --config-delayed
系统会提示你设置:
受限时段的开始小时数(例如,用 9 表示上午 9 点)
受限时段的结束小时数(例如,用 17 表示下午 5 点)
建议时间间隔(例如 20 分钟)
git add .
gocommit
就是这样!如果你在受限时段内 commit,就会看到时间选择 UI。否则,它的工作方式与之前完全相同。
在底层,这只是 ~/.gocommit.json 中的一份简单 JSON 配置:
{
"api_key": "your-api-key",
"logging_enabled": true,
"icon_mode": false,
"delayed_commit": {
"enabled": true,
"restricted_start_hour": 9,
"restricted_end_hour": 17,
"suggestion_interval_min": 20
}
}
附言:如果你觉得这个功能有用,欢迎在 GitHub 上给 GoCommit 点一颗 star!这能帮助更多开发者发现这款工具。此外,GoCommit 还会使用 AI 为你生成 commit message,因此只用一个工具,就能同时获得更好的 message 和时间安排控制能力。
GoCommit 是一款由 AI 驱动的 commit message 生成工具,它可以:
自动分析已 staged 的变更
生成有意义、符合 conventional commit 规范的 message
支持多种 AI provider(Gemini、Claude、GPT-4、Llama 等)
内置日志记录功能,用于改进 prompt
现在还提供 Delayed Commit 功能,帮助你控制时间安排
它完全免费、开源,旨在让你的 Git 工作流更加顺畅。快来试试吧!
部分评论可能仅对已登录的访客可见。登录后即可查看全部评论。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。