显示所有超过6个月未提交的分支的最简单方法是什么?

问题描述 投票:0回答:2

公司的一个存储库中似乎存在 1836 个分支,我收到了一项任务,首先显示然后删除 6 个月内未提交的所有分支。

我发现了这个问题并尝试运行(同时使用 --until 和 --before 和“month”):

#!/bin/bash
branches_to_delete_count=0
for k in $(git branch -a | sed /\*/d); do
  if [ -n "$(git log -1 --before='6 month ago' -s $k)" ]; then
    echo "NOT REALLY DELETING, git branch -D $k"
  fi
  ((branches_to_delete_count=branches_to_delete_count+1))
done
echo "Found $branches_to_delete_count branches to delete!"

但无济于事,我每次删除的分支数量都是相同的,即 1836 个。

我做错了什么?如何列出所有超过 6 个月未提交的分支?

bash git shell
2个回答
2
投票

所有分支出现的原因:

git log branch
不仅仅查看分支的head,它查看其整个历史

git log -1 --before='6 month ago' branch
将会:

  • 展开
    branch
  • 的历史
  • 仅保留超过 6 个月的提交
  • 保留第一个提交

由于(在您公司的存储库中)所有分支都有一个至少有 6 个月历史的提交,因此

git log -1 --before='6 month ago' branch
将始终显示一行。


您可以将提交范围限制为“仅包含头提交的范围”:

git log -1 --before='6 month ago' branch^..branch

或使用

git for-each-ref
作为 @phd 在他的评论中建议的:

git for-each-ref --format="%(refname) %(creatordate)" --sort='-creatordate' refs/heads/

并保留有足够老日期的树枝。


[更新]

自从上面第一个答案以来,我了解到了

git log --no-walk
的存在:

git log --oneline --no-walk --before="6 months ago" --branches --remotes

或者,使用格式选项,您可以仅打印分支名称:

git log --format="%D" --no-walk --before="6 months ago" --branches --remotes

(注意:如果多个分支指向同一个提交,上面的命令将打印多个用逗号分隔的名称,因此从技术上讲,您可以看到类似的内容:

origin/branch1
origin/branch2, origin/branch3
origin/branch4
...

为了编写脚本,您可以添加

... | sed -e 's/, /\n/g'
以确保每行有 1 个分支名称)


-1
投票

我们没有直接获取6个月前最后一次提交的分支名称,所以我们结合git命令并制作shell脚本

这里我们传递两个git命令

  • 首先是
    git branch | sed s/^..//
    这里获取分支并删除两个空格
  • 第二个是
    git log -1 --before='6 month ago' <branch-name>

在终端中传递以下命令 在终端中复制并粘贴给出分支名称

for branch in `git branch | sed s/^..//` ; do log=`git log -1 --before='6 month ago' $branch`; if [ ${#log} -gt 0 ] ; then echo $branch; fi; done

这是 shell 脚本以及与上面相同的 git 命令

test.sh
保存shell脚本,更改模式
chmod +x test.sh
然后运行
bash test.sh

month=6 #check how many year ago
for branch in `git branch | sed s/^..//`  #get branch one by one 
do
  log=`git log -1 --before='%s month ago'$month $branch` #getting log of the branch last commit base on month
  if [ ${#log} -gt 0 ] #check if  log has output then it has branch commit before specify month ago 
  then 
      echo $branch  # print branch name which is in our project
  fi
done

让我知道它是否有效

© www.soinside.com 2019 - 2024. All rights reserved.