删除超过X天/周的所有分支

时间:2012-04-26 00:15:15

标签: git shell

我发现下面的脚本按日期列出了分支。如何对此进行过滤以排除较新的分支并将结果提供给Git delete命令?

for k in $(git branch | sed /\*/d); do 
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk '{print $2}'

11 个答案:

答案 0 :(得分:36)

如何使用--since--before

例如,这将删除一周内未收到任何提交的所有分支:

for k in $(git branch | sed /\*/d); do 
  if [ -n "$(git log -1 --since='1 week ago' -s $k)" ]; then
    git branch -D $k
  fi
done

如果要删除超过一周的所有分支,请使用--before

for k in $(git branch | sed /\*/d); do 
  if [ -n "$(git log -1 --before='1 week ago' -s $k)" ]; then
    git branch -D $k
  fi
done

请注意,这也会删除未合并为master的分支或任何已签出分支的分支。

答案 1 :(得分:7)

穷人的方法:

按上次提交日期列出分支(xargs echo命令使其内联 - thx Jesse ):

git branch --sort=committerdate | xargs echo

这将列出分支从旧分支开始到新分支,如下所示:

1_branch 2_branch 3_branch 4_branch

复制前n个,过期并粘贴在批量删除命令的末尾:

git branch -D 1_branch 2_branch

答案 2 :(得分:4)

这类似于 Daniel Baulig 的答案,但也考虑了 ben 的评论。此外,它按给定的模式过滤分支,因为我们使用try-XX约定进行分支。

for k in $(git branch -r | awk -F/ '/\/YOUR_PREFIX_HERE/{print $2}' | sed /\*/d); do
   if [ -z "$(git log -1 --since='Jul 31, 2015' -s origin/$k)" ]; then
     echo deleting "$(git log -1 --pretty=format:"%ct" origin/$k) origin/$k";
     git push origin --delete $k;
   fi;
done

答案 3 :(得分:2)

这对我有用:

for k in $(git branch -r | sed /\*/d); do 
  if [ -z "$(git log -1 --since='Aug 10, 2016' -s $k)" ]; then
    branch_name_with_no_origin=$(echo $k | sed -e "s/origin\///")
    echo deleting branch: $branch_name_with_no_origin
    git push origin --delete $branch_name_with_no_origin
  fi
done

关键部分是分支名称(变量$ k)包含/origin/部分,例如origin/feature/my-cool-new-branch 但是,如果你尝试git push --delete,它将失败并出现如下错误:
无法删除'origin / feature / my-cool-new-branch':远程引用不存在。
因此,我们使用sed删除/origin/部分,以便我们留下一个分支名称,如feature/my-cool-new-branch,现在git push --delete将起作用。

答案 4 :(得分:1)

for k in $(git branch -r | sed /\*/d); do 
  if [ -n "$(git log -1 --before='80 week ago' -s $k)" ]; then
    git push origin --delete "${k/origin\//}"
  fi
done

答案 5 :(得分:0)

我假设您只想删除引用,而不是删除分支中的提交。删除除最近__X__之外的所有合并分支:

git branch -d `for k in $(git branch | sed /\*/d); do
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk 'BEGIN{ORS=" "}; {if(NR>__X__) print $2}'`

删除时间戳__Y__之前的所有分支:

git branch -d `for k in $(git branch | sed /\*/d); do
  echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk 'BEGIN{ORS=" "}; {if($1<__Y__) print $2}'`

如果要删除尚未合并的分支,请将-d选项替换为-D ...但要小心,因为这会导致悬挂提交被垃圾收集在某些时候。

答案 6 :(得分:0)

above code对我不起作用,但是已经很接近了。相反,我使用了以下内容:

for k in $(git branch | sed /\*/d); do 
  if [[ ! $(git log -1 --since='2 weeks ago' -s $k) ]]; then
    git branch -D $k
  fi
done

答案 7 :(得分:0)

基于@ daniel-baulig的回答以及我对此的评论:

for k in $(git branch -r --format="%(refname:short)" | sed s#^origin/##); do
   if [ -z "$(git log -1 --since='4 week ago' -s $k)" ]; then
    ## Info about the branches before deleting
    git log -1 --format="%ci %ce - %H $k" -s $k;
    ## Delete from the remote
    git push origin --delete $k;
    ## Delete the local branch, regardless of whether it's been merged or not
    git branch -D $k
  fi;
done

这可用于删除所有旧分支(合并或未合并)。 这样做的动机是,一个月内没有被触及的分支腐烂并永远无法使其掌握的可能性不大。自然,修剪旧分支的时间范围取决于主分支的移动速度。

答案 8 :(得分:0)

仅在一个月前的最后一次提交中合并到master的本地分支显示删除命令的安全方法。

browser.click(a[href*="/abc/def"])

什么都不做,只是输出如下内容:

for k in $(git branch --format="%(refname:short)" --merged master); do 
  if (($(git log -1 --since='1 month ago' -s $k|wc -l)==0)); then
    echo git branch -d $k
  fi
done

我直接复制并粘贴(删除回显以将其直接删除)

这很安全。

答案 9 :(得分:0)

有时它需要知道分支是否已合并到master分支。为此,可以使用以下脚本:

#!/usr/bin/env bash

read -p "If you want delete branhes type 'D', otherwise press 'Enter' and branches will be printed out only: " action
[[ $action = "D" ]] && ECHO="" || ECHO="echo"

for b in $(git branch -r --merged origin/master | sed /\*/d | egrep -v "^\*|master|develop"); do
  if [ "$(git log $b --since "10 months ago" | wc -l)" -eq 0 ]; then
    $ECHO git push origin --delete "${b/origin\/}" --no-verify;
  fi
done

在Ubuntu 18.04上测试

答案 10 :(得分:0)

删除 5 个最旧的远程分支

git branch -r --sort=committerdate | head -n 5 | sed 's/  origin\///' | xargs git push origin --delete