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

4
我想删除存储库中创建的所有提交的时间信息,特别是时区信息。这可能吗?如果不行,是否可以将时间设置为00:00,时区设置为+0000
(我的意思是只保留日期。我只是不想要时间和时区。)
我只找到了一些关于更改所有提交者的问题,但没有关于仅更改所有提交的属性并保留其余信息的内容。
是的,我知道人们还有其他方法可以找到我住在哪里等信息,但对我来说这已经足够了。
3个回答

6
您无法“不存储时间”,但您可以将时间始终设置为00:00,将TZ设置为+0000。
对于新提交,最直接的方法是设置GIT_COMMITTER_DATE和GIT_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"

在每天的第一次提交之前,您需要确保执行此操作; 可以通过将其添加到登录脚本或其他方式来实现。

您的措辞表明您可能还有提交历史记录。 这些也可以更改,例如使用git filter-branchenv-filter选项。 有关此操作的详细信息,请参见filter-branch文档。

但是,重要的是要了解这是一个历史记录重写 - 即,您将用新的提交替换所有现有提交,如果其他人共享此存储库,则会将它们放入需要进行某些恢复的错误状态。(请参阅git rebase文档中的“从上游rebase恢复”以了解所涉及的内容)。 实际上没有办法避免这个问题 - 提交和作者日期是每个提交的组成部分。


1
更加干净,没有竞态条件: UTC_DAY_BEGIN = $(TZ = 0 date +%F)T00:00:00 +0000; export GIT_COMMITTER_DATE = $ UTC_DAY_BEGIN; export GIT_AUTHOR_DATE = $ UTC_DAY_BEGIN - ominug
@ominug 为什么您认为这会对任何“竞态条件”产生影响呢? - Mark Adelsberger
非常罕见,但我的代码只获取一次日期,而你的获取了两次。在这两次获取之间,日期可能会发生变化。 - ominug
即使我认真对待,这也不是一种竞态条件。 - Mark Adelsberger
我的意思是,如果在获取数据之间日期发生了变化,那么这两个变量将会不同。通过这个,任何人都可以推断出(shell rc)脚本在凌晨00:00准确运行。我认为这与“去除时间尤其是时区信息”的问题描述不一致。所以虽然这种情况非常罕见,但它是一个错误(无论你是否称之为竞态条件)。 - ominug

5

警告:编辑提交的任何信息都会更改其哈希值,因此也会更改所有后代提交的哈希值,这可能会导致"重写"历史,如果其他人已经获取了相关提交。


正如提到的那样,git filter-branch 可以用于一次重写多个提交记录。
仅编辑时间戳可以使用其环境过滤器来完成:

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

具体而言,可以使用 git 内部日期格式 中的值设置 GIT_AUTHOR_DATEGIT_COMMITTER_DATE 环境变量:

这里的时间格式为<unix timestamp> <time zone offset>,其中<unix timestamp>是自UNIX纪元以来经过的秒数。<time zone offset>是相对于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

(我希望保留日期,只是不需要时间和时区。)

要同时移除时间和时区,需要使用 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

注意:时区信息不会出现在格式示例中,因此这可能会在将来发生变化。因此,也可以使用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

谢谢提供信息!不幸的是,它只更改了时区,而时间本身仍然存在。编辑:对不起,我刚才意识到您在代码上方确实提到了这一点。 - Forivin
1
不客气 :). 我成功地修改了时间并将其添加到答案中。 - kelvin

0

谢谢,我试过这个工具了。它有些问题(会应用错误的时区和时间),而且除此之外,我需要花费数小时来查看所有提交记录。 :/ - Forivin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接