【问题标题】:Can GIT_COMMITTER_DATE be customized inside a git hook?可以在 git 挂钩中自定义 GIT_COMMITTER_DATE 吗?
【发布时间】:2015-09-21 15:57:56
【问题描述】:

我想手动控制 git 提交时间戳,以便我的 GIT_COMMITTER_DATE 始终与 GIT_AUTHOR_DATE 匹配。我见过很多使用 filter-branch 重写历史的解决方案,但我宁愿积极主动地把逻辑放在一个 git hook 中,这样它就可以一直匹配下去。

但我发现,虽然这些变量在调用 git 的环境中定义时可以正常工作,但在 pre-commit git 挂钩中定义它们似乎没有任何效果。例如:

# this works if run directly on cmd line, but not inside the pre-commit hook
export GIT_AUTHOR_DATE='Mon, 11 Aug 2014 11:25:16 -0400'
export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"

有没有办法在 git 钩子中动态调整这些值,以便提交自动具有所需的时间戳?我在 git 版本 1.8.5.2

【问题讨论】:

  • 您知道,根据man page,GIT_COMMITTER_DATE “不应被覆盖,除非您知道绝对需要覆盖它(以确保提交获得与另一个相同的 ID 或在迁移历史时)"?
  • 这些变量是为了明确的操作目的而提供的,这通常在命令行上完成。如果我现在想在 git hook 中进行同样的操作,会有什么不同?
  • 这不是真的,因为命令行只影响作者日期,而不是提交者日期。您不能从命令行变量更改提交者日期,只能通过环境变量。但是不,我不知道手册页这么说的根本原因。
  • 我一直在使用别名作为一种丑陋的解决方法:stackoverflow.com/questions/28832219/… 很伤心。

标签: git githooks


【解决方案1】:

post-commit钩子+git commit --amend

这不是很优雅,但它似乎可以工作并设置提交者和作者日期:

.git/hooks/post-commit

#!/usr/bin/env bash
if [ -z "${GIT_COMMITTER_DATE:-}" ]; then
  d="$(date --iso-8601=seconds)"
  GIT_COMMITTER_DATE="$d" git commit --amend --date "$d" --no-edit
fi

别忘了:

chmod +x .git/hooks/post-commit

我们检查GIT_COMMITTER_DATE 以防止它进入无限提交循环,如果用户已经过了特定时间,它也会跳过钩子。

这是一个更复杂的示例,它使用以前提交到 git logdate 操作的日期:Can I hide commits' time when I push to GitHub?

请记住,提交者日期仍然会在 git rebase 上泄漏,但这可以通过 post-rewrite 钩子解决:git rebase without changing commit timestamps

然后还有git am,可以用--committer-date-is-author-date解决,见:git rebase without changing commit timestamps

--amend --date 部分被问到:Update git commit author date when amending

您也可以将其设置为全局挂钩:Applying a git post-commit hook to all current and future reposcore.hooksPath 会阻止本地挂钩运行,这可能是个问题。

在 Git 2.19 上测试。

【讨论】:

    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2020-04-07
    • 1970-01-01
    • 2018-02-12
    • 2022-01-27
    相关资源
    最近更新 更多