发布于 2026-01-06 11 阅读
0

“你为什么要在工作时间提交代码?”——一个面试问题如何促使我开发出延迟提交功能

“你为什么要在工作时间提交代码?”——一个面试问题如何促使我开发出延迟提交功能

改变我观点的那次采访

想象一下:我正在参加技术面试,对自己目前的回答相当有信心。然后面试官瞥了一眼我的 GitHub 个人资料,问了一个看似无关紧要的问题:

我注意到你大部分代码都是在工作时间提交的。你能跟我说说你的开发工作流程吗?

我愣住了。

并非因为我做错了什么,而是因为我突然意识到,代码提交时间戳能揭示我们多少工作习惯。那一刻,我明白我的 GitHub 贡献图谱不仅仅显示了我的编码活动——它无意间向全世界展示了我的工作安排。

这个面试问题让我思考:如果开发者希望更好地控制代码提交的显示时间,该怎么办?

我们不愿谈及的问题

作为开发者,我们生活在一个透明的世界。我们的 GitHub 个人资料就是我们的简历,我们的贡献图表就是我们的绩效指标,我们的提交历史就是公开的资料。但这里有一个令人不安的事实:

  • 工作与生活的界限正在变得模糊:凌晨 2 点出现的绿色方块?可能只是因为你终于修复了那个 bug,但对某些雇主来说,它却代表着“随时待命”。
  • 时区混淆:在亚洲工作却申请欧洲公司?你的工作时间可能会让招聘人员觉得奇怪。
  • 隐私问题:并非每个人都希望自己的日常生活被全世界看到。
  • 无意识偏见:有些人评判生产力的标准是提交的时间,而不是提交的内容。

那次采访之后,我决定为此做点什么。我我的AI驱动的提交信息生成器GoCommit开发了延迟提交功能。

什么是延迟提交?

这个概念很简单但很强大:阻止在您规定的工作时间内提交,并允许您安排稍后提交。

它的运作方式如下:

  1. 您可以自行设置“限制营业时间”(例如,上午 9 点至下午 5 点)。
  2. 当你在这些时间段内尝试提交时,GoCommit 会拦截它。
  3. 界面友好,并建议其他时间。
  4. 您选择一个时间(或输入自定义时间)
  5. 您的提交是使用该时间戳创建的。

无需脚本,无需手动输入 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
}
Enter fullscreen mode Exit fullscreen mode

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   │
└──────────────────────────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

这样可以确保作者日期(代码编写日期)和提交者日期(提交记录日期)与您选择的时间相符。

实际应用案例

自从实现了这个功能以来,我发现了几个合理的用例:

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
Enter fullscreen mode Exit fullscreen mode

2. 配置您的 API 密钥

GoCommit 使用 AI 生成提交消息,因此您需要一个 API 密钥:

gocommit --config
Enter fullscreen mode Exit fullscreen mode

您可以选择 Google Gemini 或 OpenRouter(后者可让您访问 Claude、GPT-4、Llama 等)。

3. 启用延迟提交

gocommit --config-delayed
Enter fullscreen mode Exit fullscreen mode

系统会提示您进行以下设置:

  • 限制开始时间(例如,9 点开始,9 点开始)
  • 限制结束时间(例如,下午 5 点结束时间为 17 点)
  • 建议间隔(例如,20分钟)

4. 自然使用

git add .
gocommit
Enter fullscreen mode Exit fullscreen mode

就是这样!如果您在限制时段提交作品,就会看到时间选择界面。否则,操作方式与之前完全相同。

配置文件

其底层只是一个简单的 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
  }
}
Enter fullscreen mode Exit fullscreen mode

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