0

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

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

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

4

1 回答 1

0

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

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

有一些事情你必须考虑使用git-rev-list

  1. 使用时,HEAD您总是指的是当前分支。因此,例如,当您签出获得的提交 ID 之一时,您的 HEAD 将会更改。您可能想要使用master或任何其他分支名称作为参考。
  2. Git没有提交的时间顺序。您可以在9 月 1 日提交之后按层次结构在8月 1 日提交提交。这将导致在使用--beforeor--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。(这个提交不一定是在那个月进行的,也许那个月无论如何都没有提交。)

于 2011-10-21T14:05:01.783 回答