我发现下面的脚本按日期列出了分支。如何对此进行过滤以排除较新的分支并将结果提供给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}'
答案 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