公司的一个存储库中似乎存在 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 个月未提交的分支?
所有分支出现的原因:
git log branch
不仅仅查看分支的head,它查看其整个历史。
git log -1 --before='6 month ago' branch
将会:
branch
由于(在您公司的存储库中)所有分支都有一个至少有 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 个分支名称)
我们没有直接获取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
让我知道它是否有效