删除所有 git 提交的时间和时区,但保留日期

For*_*vin 3 git git-commit

我想删除在存储库中创建的所有提交的时间,尤其是时区信息。那可能吗?如果不是,是否可以简单地将时间00:00和时区设置为+0000
(顺便说一句,我想保留日期。这只是我不想要的时间和时区。)

我只发现了关于更改所有提交的作者的问题,但没有发现关于仅更改所有提交中的属性以保留剩余信息的问题。

是的,我知道人们可以通过其他方式找到我住的地方等,但这对我来说已经足够了。

Mar*_*ger 5

您不能“不存储时间”,但您始终可以将时间设置为 00:00,将 TZ 设置为 +0000。

对于新的提交,最直接的方法是设置GIT_COMMITTER_DATEGIT_AUTHOR_DATE环境变量。例如在bash命令行你可以说

export GIT_COMMITTER_DATE="$(date +%Y-%m-%d) 00:00:00+0000"
export GIT_AUTHOR_DATE="$(date +%Y-%m-%d) 00:00:00+0000"
Run Code Online (Sandbox Code Playgroud)

你要确保在每天第一次提交之前这样做;也许通过将它添加到您的登录脚本或其他东西。

你的措辞表明你可能也有提交的历史。这些也可以更改,例如通过git filter-branchenv-filter选项一起使用。有关其工作原理的详细信息,请参阅https://git-scm.com/docs/git-filter-branch 上filter-branch文档。

但是,重要的是要了解这是历史重写 - 即您将用新提交替换所有现有提交,并且如果其他人共享此存储库,它将使它们处于需要恢复的损坏状态。(请参阅 git rebase 文档中的“从上游 rebase 恢复”以了解将涉及的内容。)实际上没有办法解决这个问题 - 提交和作者日期是每次提交的一个组成部分。


kel*_*vin 5

警告:编辑提交的任何信息都会更改其哈希值,从而更改所有后代提交的哈希值, 如果其他人已经获取了相关提交,则可能会导致“重写”历史记录。


如前所述,git filter-branch可用于一次重写多个提交。

仅编辑时间戳可以使用其 环境过滤器来完成:

如果您只需要修改执行提交的环境,则可以使用此过滤器。具体来说,您可能想要重写作者/提交者姓名/电子邮件/时间环境变量(有关详细信息,请参阅 git-commit-tree )。

具体来说,可以 使用 git内部日期格式的GIT_AUTHOR_DATE值设置和环境变量:GIT_COMMITTER_DATE

它是 <unix timestamp> <时区偏移>,其中 <unix timestamp> 是自 UNIX 纪元以来的秒数。<时区偏移> 是相对于 UTC 的正偏移或负偏移。例如,CET(比 UTC 早 1 小时)为 +0100。

警告:以下代码示例立即重写整个树。

它们可以直接在env-filter中简单地更改

我想删除存储库中创建的所有提交的时间,尤其是时区信息。

要仅删除时区信息,只需将日期变量设置为$timestamp +0000

git filter-branch --env-filter '
  GIT_AUTHOR_DATE="$(git show -q --format="%at" "$GIT_COMMIT") +0000"
  GIT_COMMITTER_DATE="$(git show -q --format="%ct" "$GIT_COMMIT") +0000"
  ' -- --all
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,我想保留日期。这只是我不想要的时间和时区。)

删除time和timezone,有点棘手(使用 ISO 8601格式

git filter-branch --env-filter '
  author_ts="$(git show -q --format="%at" "$GIT_COMMIT")"
  committer_ts="$(git show -q --format="%ct" "$GIT_COMMIT")"
  GIT_AUTHOR_DATE="$(date -d "@$author_ts" +"%Y-%m-%dT00:00:00 +0000")"
  GIT_COMMITTER_DATE="$(date -d "@$committer_ts" +"%Y-%m-%dT00:00:00 +0000")"
  ' -- --all
Run Code Online (Sandbox Code Playgroud)

注意:时区信息不会出现在格式示例中,因此将来可能会中断。因此,也可以使用 TZ 环境变量来设置时区,但我不确定它的可移植性如何:

TZ=UTC git filter-branch --env-filter '
  author_ts="$(git show -q --format="%at" "$GIT_COMMIT")"
  committer_ts="$(git show -q --format="%ct" "$GIT_COMMIT")"
  GIT_AUTHOR_DATE="$(date -d "@$author_ts" +"%Y-%m-%dT00:00:00")"
  GIT_COMMITTER_DATE="$(date -d "@$committer_ts" +"%Y-%m-%dT00:00:00")"
  ' -- --all
Run Code Online (Sandbox Code Playgroud)