“你为什么要在工作时间提交代码?”——一个面试问题如何促使我开发出延迟提交功能
改变我观点的那次采访
想象一下:我正在参加技术面试,对自己目前的回答相当有信心。然后面试官瞥了一眼我的 GitHub 个人资料,问了一个看似无关紧要的问题:
我注意到你大部分代码都是在工作时间提交的。你能跟我说说你的开发工作流程吗?
我愣住了。
并非因为我做错了什么,而是因为我突然意识到,代码提交时间戳能揭示我们多少工作习惯。那一刻,我明白我的 GitHub 贡献图谱不仅仅显示了我的编码活动——它无意间向全世界展示了我的工作安排。
这个面试问题让我思考:如果开发者希望更好地控制代码提交的显示时间,该怎么办?
我们不愿谈及的问题
作为开发者,我们生活在一个透明的世界。我们的 GitHub 个人资料就是我们的简历,我们的贡献图表就是我们的绩效指标,我们的提交历史就是公开的资料。但这里有一个令人不安的事实:
- 工作与生活的界限正在变得模糊:凌晨 2 点出现的绿色方块?可能只是因为你终于修复了那个 bug,但对某些雇主来说,它却代表着“随时待命”。
- 时区混淆:在亚洲工作却申请欧洲公司?你的工作时间可能会让招聘人员觉得奇怪。
- 隐私问题:并非每个人都希望自己的日常生活被全世界看到。
- 无意识偏见:有些人评判生产力的标准是提交的时间,而不是提交的内容。
那次采访之后,我决定为此做点什么。我为我的AI驱动的提交信息生成器GoCommit开发了延迟提交功能。
什么是延迟提交?
这个概念很简单但很强大:阻止在您规定的工作时间内提交,并允许您安排稍后提交。
它的运作方式如下:
- 您可以自行设置“限制营业时间”(例如,上午 9 点至下午 5 点)。
- 当你在这些时间段内尝试提交时,GoCommit 会拦截它。
- 界面友好,并建议其他时间。
- 您选择一个时间(或输入自定义时间)
- 您的提交是使用该时间戳创建的。
无需脚本,无需手动输入 Git 命令,无需费力地调整--date参数。只有流畅、一体化的体验。
魔法背后的架构
开发这个功能的过程非常有趣。以下是其底层工作原理:
1. 时间验证
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
}
2. 智能时间建议
系统会根据您的限制条件,以可配置的间隔(默认值: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 │
└──────────────────────────────────────────────────────────┘
3. Git 集成
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
}
这样可以确保作者日期(代码编写日期)和提交者日期(提交记录日期)与您选择的时间相符。
实际应用案例
自从实现了这个功能以来,我发现了几个合理的用例:
1. 保持工作与生活的界限
开发者希望将个人项目与工作时间分开,但又不想改变实际的编码时间。
2. 时区管理
远程工作者希望他们的工作成果能在雇主所在时区的“正常”时间内显示。
3. 隐私保护
不希望客户追踪其确切工作时间的自由职业者。
4. 贡献图美学
说实话,有些人只是想要一个更美观的贡献图。这也没关系!
5. 追溯提交
有时你会离线编写代码,或者忘记提交。设置准确的时间戳有助于维护真实的代码历史记录。
伦理问题
我知道你在想什么:“这难道不是……不诚实吗?”
我们来谈谈这件事吧。
我的看法是: Git 时间戳一直都很灵活。你可以手动设置,也可以通过变基(rebase)更改,或者使用各种工具来修改历史记录。这个功能并没有带来任何新功能,只是让现有功能更容易访问和使用。
真正的问题是:你的编程计划是否应该公开?
我认为不应该这样。你作为开发者的价值来自于:
- 你的代码质量
- 你的问题解决能力
- 你们的协作和沟通
- 你的工作的影响
这与你是在下午 2 点还是凌晨 2 点提交无关。
这个工具能帮你掌控历史记录,无需撒谎。你依然在编写代码,依然在提交更改——你只是可以选择它们何时出现在你的历史记录中。
入门
想试试吗?以下是如何设置 GoCommit 的延迟提交功能:
1. 安装 GoCommit
# Linux/macOS
curl -sSL https://raw.githubusercontent.com/thanhphuchuynh/gocommit/main/install.sh | bash
# Or download from releases
# https://github.com/thanhphuchuynh/gocommit/releases
2. 配置您的 API 密钥
GoCommit 使用 AI 生成提交消息,因此您需要一个 API 密钥:
gocommit --config
您可以选择 Google Gemini 或 OpenRouter(后者可让您访问 Claude、GPT-4、Llama 等)。
3. 启用延迟提交
gocommit --config-delayed
系统会提示您进行以下设置:
- 限制开始时间(例如,9 点开始,9 点开始)
- 限制结束时间(例如,下午 5 点结束时间为 17 点)
- 建议间隔(例如,20分钟)
4. 自然使用
git add .
gocommit
就是这样!如果您在限制时段提交作品,就会看到时间选择界面。否则,操作方式与之前完全相同。
配置文件
其底层只是一个简单的 JSON 配置~/.gocommit.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
}
}
PS:如果您觉得这篇文章有用,请在 GitHub 上给GoCommit点个星!这有助于更多开发者发现这款工具。此外,GoCommit 使用 AI 生成提交信息,让您在一个工具中即可获得更优质的提交信息和提交计划控制。
关于本项目
GoCommit是一个由人工智能驱动的提交信息生成器,它具有以下功能:
- 自动分析您分阶段的更改
- 生成有意义、符合规范的提交消息
- 支持多种人工智能提供商(Gemini、Claude、GPT-4、Llama 等)
- 包含内置日志记录功能,以便及时改进
- 现在支持延迟提交以进行进度控制
它是免费的开源软件,旨在让你的 Git 工作流程更加顺畅。快来体验一下吧!
文章来源:https://dev.to/thanhphuchuynh/why-do-you-push-code-during-work-hours-how-an-interview-question-led-me-to-build-a-delayed-4e4k