如何删除所有超过一年的 Git 远程分支?

Posted

技术标签:

【中文标题】如何删除所有超过一年的 Git 远程分支?【英文标题】:How can I delete all Git remote branches which are older than a year? 【发布时间】:2018-04-05 12:06:35 【问题描述】:

我的“远程”服务器上有很多 GIT 分支。

    如何删除所有超过 1 年的分支(不只是合并)? 如何删除所有超过 5 个月的合并分支(多个来源“master/develop”)?

这个答案非常好,但它并没有让我一直到那里。 How can I delete all Git branches which have been merged?

能否请您包含合并中的主/开发分支?如何为此添加时间间隔?

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

【问题讨论】:

我知道这并不能完全回答你的问题,但是如果分支的数量不是太多的话,GitHub 有一个方便的工具来完成这类工作。不过,据我所知,您必须手动输入网址:github.com/cyborgx37/sandbox/branches Git 不会将分支创建日期存储为信息。您可以查找的是 1 年前最后一次提交的分支。为此,您可以尝试使用 git for-each-ref 命令:git-scm.com/docs/git-for-each-ref 我同意@frennky。另外,“超过 1 年”是什么意思?最近的提交超过 1 年?第一次提交超过 1 岁? (“第一次提交”的概念在 git 中有点模糊,可能并不明显,具体取决于您的历史记录。) 【参考方案1】:

您可以使用shell脚本删除超过一年的没有合并的分支,并删除超过五个月的合并分支。

删除超过一年的未合并分支

    #!/bin/bash
    
    tarBranch=$(git branch -r --no-merged | grep -v master | grep -v developer | sed 's/origin\///')
    for branch in $tarBranch
    do
     echo $branch
     lastDate=$(git show -s --format=%ci origin/$branch)
     convertDate=$(echo $lastDate | cut -d' ' -f 1)
     Todate=$(date -d "$convertDate" +'%s')
     current=$(date +'%s')
     day=$(( ( $current - $Todate )/60/60/24 ))
     echo "last commit on $branch branch was $day days ago"
     if [ "$day" -gt 365 ]; then
        git push origin :$branch
        echo "delete the old branch $branch"
     fi
    done

删除超过五个月的合并分支

    #!/bin/bash
    
    git checkout master
    #deleted merged branches on master branch
    tarBranch=$(git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///')
    for branch in $tarBranch
    do
     echo $branch
     lastDate=$(git show -s --format=%ci origin/$branch)
     convertDate=$(echo $lastDate | cut -d' ' -f 1)
     Todate=$(date -d "$convertDate" +'%s')
     current=$(date +'%s')
     day=$(( ( $current - $Todate )/60/60/24 ))
     echo "last commit on $branch branch was $day days ago"
     if [ "$day" -gt 150 ]; then
        git push origin :$branch
        echo "delete the old branch $branch"
     fi
    done

    git checkout develop
    #deleted merged branches on developer branch
    tarBranch=$(git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///')
    for branch in $tarBranch
    do
     echo $branch
     lastDate=$(git show -s --format=%ci origin/$branch)
     convertDate=$(echo $lastDate | cut -d' ' -f 1)
     Todate=$(date -d "$convertDate" +'%s')
     current=$(date +'%s')
     day=$(( ( $current - $Todate )/60/60/24 ))
     echo "last commit on $branch branch was $day days ago"
     if [ "$day" -gt 150 ]; then
        git push origin :$branch
        echo "delete the old branch $branch"
     fi
    done

【讨论】:

你能用 GIT Bash 格式写这个吗?我很难正确转换它。

以上是关于如何删除所有超过一年的 Git 远程分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地和远程删除 Git 分支?

如何删除git远程分支(转)

你如何停止在 Git 中跟踪远程分支?

如何从 Git 中删除无效的远程分支引用?

git如何删除远端不存在的本地分支?

如何从远程仓库中的 master 删除 GIT 分支并从另一个分支启动新分支?