shell git log --before=“4 months”显示3周前提交过的分支,我做错了什么?

thigvfpy  于 2023-03-09  发布在  Shell
关注(0)|答案(1)|浏览(115)

所以我有这个代码片段,我想用它来过滤掉没有特定前缀的分支,以及超过3个月没有收到任何提交的分支,这样我就可以在以后将它们从远程中删除。

for k in $(git branch -r | awk -Forigin !'/\/Prefix1\/|\/prefix2\//'); do
  if [ "$(git log -1 --before="3 month" $k)" ]; then
    echo "$(git log -1 --pretty=format:"%ci, %cr, " $k) $k";
  fi;
done

目前的问题是,当我运行这个我看到分支已收到提交3周前,5个月前,2个月前,1个月前等,我不能找出原因。
但如果我只跑:git log --before=“4个月”--pretty=format:“%ci,%cr,“它按预期工作。
有谁能给予我点指导吗?

gdx19jrr

gdx19jrr1#

git log -1 [filters] $k中的-1将:

  • 展开git log [filters] $k的历史记录
  • 将此历史记录限制在其第一行

因此,如果一个分支的历史记录中有一个3个月前的提交(我猜:你的任何分支都有),git log -1 --before="3 month" $k将总是显示1行--它的历史中第一个超过3个月的提交。
您的前导if [ ... ]条件将始终为真。
要解决这个问题,您可以限制提交的范围,只选择每个分支的前导提交:

git log --before="3month" $k^..$k

[编辑]
另一个选项(如用户phdthis question的注解中所建议的)是列出每个分支及其最上面的提交日期,并且只保留日期低于4个月前的行:

# in this example I use 'committerdate', you may also use 'authordate' if
# you think it is a better fit for your needs
git branch -r --format="%(committerdate:format:%F)  %(refname:short)" \
    --sort=-committerdate | <... process the list ...>
  • 注意 * git branch--format选项记录在git help for-each-ref中(此处为:--格式标志,此处:字段名称部分),

如果您滚动到"字段名称“部分的底部,您将看到有关如何格式化日期字段的说明:
作为日期类型字段的一种特殊情况,您可以通过添加:,然后添加日期格式名称来指定日期格式(请参阅git-rev-list[1]--date选项所取的值)。

相关问题