我发现下面的脚本,按日期列出了分支机构。 如何过滤这个排除新的分支机构和饲料,结果到Git的删除命令?
for k in $(git branch | sed /\*/d); do
echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk '{print $2}'
我发现下面的脚本,按日期列出了分支机构。 如何过滤这个排除新的分支机构和饲料,结果到Git的删除命令?
for k in $(git branch | sed /\*/d); do
echo "$(git log -1 --pretty=format:"%ct" $k) $k"
done | sort -r | awk '{print $2}'
如何使用--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
被警告不过,这也将删除其中不合并到主或任何签出的分支的分支。
穷人的方法:
按日期列出分支最后一次提交(该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
它类似于丹尼尔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
这是对我工作:
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会工作。
我假设你要删除只是裁判,而不是在分支机构提交。 要删除所有合并分支机构,除了最近__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
如果你想删除尚未合并以及分支...但要小心,因为这将导致悬挂承诺在某一时刻被垃圾收集。
在上面的代码并没有为我工作,但它接近。 相反,我用了以下内容:
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
基于@丹尼尔 - 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
这可以用来删除所有老枝(合并与否)。 这样做的动机是,它是不可能的,尚未触及一个月腐烂,永不分支机构使其掌握。 当然,对于修剪老枝的时间表取决于主分支移动的速度有多快。