【问题标题】:How to go back in time with cygwin date, returning dates with static second values如何使用 cygwin 日期返回时间,返回具有静态秒值的日期
【发布时间】:2011-10-11 21:31:29
【问题描述】:

我正在使用 git,试图同步到去年每个月的第一次提交。我希望能够在每个月的第一天,每个月的第一天,逐月返回。或者至少来自一些恒定的“秒”值。到目前为止,我有这个:

$(git rev-list --before "$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01" -n 01 HEAD)

这显然不包括恒定的秒值。就目前而言,运行此脚本并在一小时后再次运行它会返回两个不同的 sha1,因为它从我运行脚本的确切时间开始返回 x 个月。无论何时运行此脚本,我都希望返回的 sha1 相同。那有意义吗?有什么想法吗?

【问题讨论】:

    标签: git date cygwin sync seconds


    【解决方案1】:

    首先,您的命令中有一个错字。它必须是--before="$(...,你错过了=

    date 的行为不是这里的问题。 date +%Y-%m-01 将返回类似2011-10-01 的字符串,不包含额外的时间信息。因此,第二次日期调用会将其减少 $i 的月数,并且还会返回格式为 2011-09-01 的字符串。除了该字符串之外,没有其他信息作为参数--before= 的值传递给git-rev-list

    使用git-rev-list,您需要考虑一些事项:

    1. 当使用HEAD 时,您总是指的是current 分支。因此,例如,当您签出获得的提交 ID 之一时,您的 HEAD 将会更改。您可能想使用 master 或任何其他分支名称作为参考。
    2. Git 没有提交的时间顺序。您可以在 8 月 1 日分层在 9 月 1 日提交之后编写提交。当使用 --before--after 参数时,这将导致输出混乱,因为它们依赖于提交者字段的时间戳。
    3. 提交者字段的时间戳也可能具有误导性。当您的分支没有线性历史时,很难判断某个提交是否在某个历史时间点成为存储库中分支的一部分。作者可能在提交 X 个月后推送/合并了他的分支,因此其他人看不到它。

    考虑到所有这些,以下命令对我有用:

    $(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)

    这将返回给定月份的第一天之后的第一次提交的 ID。 (这个提交不一定是在那个月进行的,也许那个月无论如何都没有提交。)

    【讨论】:

    • 谢谢 Scolytus,对学习者来说非常有见地。我会尝试使用master
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多