删除超过X天/周老都比较各分公司(Delete all branches that are more

2019-07-29 03:25发布

我发现下面的脚本,按日期列出了分支机构。 如何过滤这个排除新的分支机构和饲料,结果到Git的删除命令?

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

Answer 1:

如何使用--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

被警告不过,这也将删除其中不合并到主或任何签出的分支的分支。



Answer 2:

穷人的方法:

按日期列出分支最后一次提交(该xargs echo命令使得在线- THX 杰西 ):

git branch --sort=committerdate | xargs echo

这将列出从旧到新的这样开始分支:

1_branch 2_branch 3_branch 4_branch

复制前n个孩子,就是已经过时,在批的糊底delete命令:

git branch -D 1_branch 2_branch


Answer 3:

它类似于丹尼尔Baulig答案的东西,但也需要考虑的评论。 此外,它通过给定的图案过滤分支,因为我们使用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


Answer 4:

这是对我工作:

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但是,如果你试图混帐推--delete,它会失败,错误喜欢:
无法删除“原点/特征/我 - 冷 - 新枝”:远程参考不存在。
所以我们用sed删除/origin/一部分,这样我们只剩下一个分支名类似feature/my-cool-new-branch ,现在混帐推--delete会工作。



Answer 5:

我假设你要删除只是裁判,而不是在分支机构提交。 要删除所有合并分支机构,除了最近__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如果你想删除尚未合并以及分支...但要小心,因为这将导致悬挂承诺在某一时刻被垃圾收集。



Answer 6:

在上面的代码并没有为我工作,但它接近。 相反,我用了以下内容:

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


Answer 7:

基于@丹尼尔 - 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

这可以用来删除所有老枝(合并与否)。 这样做的动机是,它是不可能的,尚未触及一个月腐烂,永不分支机构使其掌握。 当然,对于修剪老枝的时间表取决于主分支移动的速度有多快。



文章来源: Delete all branches that are more than X days/weeks old
标签: git shell