首先,您的命令中有错字。它必须是--before="$(...
,你错过了=
。
的行为date
不是这里的问题。date +%Y-%m-01
将返回类似2011-10-01
字符串的内容,不包含其他时间信息。因此,第二次日期调用将减少$i
月数,并且还会返回格式如2011-09-01
. git-rev-list
除了该字符串之外,没有其他信息作为参数值传递给--before=
。
有一些事情你必须考虑使用git-rev-list
:
- 使用时,
HEAD
您总是指的是当前分支。因此,例如,当您签出获得的提交 ID 之一时,您的 HEAD 将会更改。您可能想要使用master
或任何其他分支名称作为参考。
- Git没有提交的时间顺序。您可以在9 月 1 日提交之后按层次结构在8月 1 日提交提交。这将导致在使用
--before
or--after
参数时混淆输出,因为它们依赖于提交者字段的时间戳。
- 提交者字段的时间戳也可能具有误导性。当您的分支没有线性历史时,很难判断某个提交是否在某个历史点成为存储库中分支的一部分。作者可能在提交 X 个月后推送/合并了他的分支,因此其他人看不到它。
考虑到所有这些,以下命令对我有用:
$(git rev-list --after="$(date -d "$(date +%Y-%m-01) -$i months" +%Y-%m)-01 00:00:00" master | tail -n 1)
这将返回给定月份的第一天之后的第一次提交的 ID。(这个提交不一定是在那个月进行的,也许那个月无论如何都没有提交。)