清理旧的远程git分支

这是我的git工作stream程。

我从两台不同的计算机(A和B)工作,并将常用的git远程存储在收存箱目录中。

比方说,我有两个分支主和开发。 两者都跟踪他们的远程同行的起源/主和起源/发展。

现在在计算机A上,我删除分支开发 – 本地和远程 – 如下所示:

git push origin :heads/devel git branch -d devel 

现在,如果我在计算机A上做git branch -a ,我就可以了

 master origin/HEAD origin/master 

我现在去电脑B.做git fetch 。 我可以通过删除当地的devel分支

 git branch -d devel 

但是我无法删除远程devel分支。

 git push origin :heads/devel error: unable to push to unqualified destination: heads/proxy3d The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. fatal: The remote end hung up unexpectedly 

git branch -a仍然在远程分支中列出origin / devel。

我如何清理机器B的远程开发项目?

首先,机器B上的git branch -a的结果是什么?

第二,你已经删除了heads/devel的原因,所以这是为什么你不能从机器B删除它。

尝试

 git branch -r -d origin/devel 

要么

 git remote prune origin 

要么

 git fetch origin --prune 

并且随意添加--dry-run到你的git语句的结尾,看看运行它的结果,而不需要真正运行它。

考虑运行:

 git fetch --prune 

定期在每个回购删除当地分行已经跟踪远程分行被删除(不再存在于远程GIT回购)。

这可以通过进一步简化

 git config remote.origin.prune true 

这是一个per-repo设置,将使任何未来的git fetch or git pull自动修剪

或者你也可以编辑全球.gitconfig和添加

 [fetch] prune = true 

为所有的git仓库做一个设置。

这里是可以为你做的bash脚本。 它是http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git脚本的修改版本。; 我的修改使其能够支持不同的远程位置。

 #!/bin/bash current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') if [ "$current_branch" != "master" ]; then echo "WARNING: You are on branch $current_branch, NOT master." fi echo -e "Fetching merged branches...\n" git remote update --prune remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$") local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$") if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then echo "No existing branches have been merged into $current_branch." else echo "This will remove the following branches:" if [ -n "$remote_branches" ]; then echo "$remote_branches" fi if [ -n "$local_branches" ]; then echo "$local_branches" fi read -p "Continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then remotes=`echo "$remote_branches" | sed 's/\(.*\)\/\(.*\)/\1/g' | sort -u` # Remove remote branches for remote in $remotes do branches=`echo "$remote_branches" | grep "$remote/" | sed 's/\(.*\)\/\(.*\)/:\2 /g' | tr -d '\n'` git push $remote $branches done # Remove local branches git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'` else echo "No branches removed." fi fi 

这个命令将“干运行”删除所有远程( origin )合并分支,除了master 。 你可以改变它,或者在master之后添加额外的分支: grep -v for-example-your-branch-here |

 git branch -r --merged |  grep origin |  grep -v '>' |  grep -v master |  xargs -L1 |  awk '{sub(/origin\//,"");print}'|  xargs git push origin --delete --dry-run 

如果看起来不错,请删除--dry-run 。 此外,你可能会喜欢首先在叉子上进行testing。

以下是如何使用SourceTree(v2.3.1):
1.单击提取
2.选中“修剪跟踪分支…”
3.按OK
4. </s>

在这里输入图像描述

 git push --all --prune --dry-run 

这将删除远程仓库中的所有分支,而不是您当地的仓库 。 如果你喜欢你所看到的,再次运行命令没有--dry-run

回应评论:从本质--dry-run ,删除的行为是危险的,因此可以随意追加--dry-run阅读并阅读man git push

如果git branch -r显示了许多您不感兴趣的远程跟踪分支,并且只想从本地删除它们,请使用以下命令:

 git branch -r | grep -Ev 'HEAD|master|develop' | xargs -r git branch -rd 

更安全的版本将只是删除合并的版本:

 git branch -r --merged | grep -Ev 'HEAD|master|develop' | xargs -r git branch -rd 

这可能对于大型项目非常有用,在这些项目中,您不需要其他队友的function分支,但是在初始克隆上获取大量远程追踪分支。

而这一步是不完整的,因为那些被删除的远程追踪分支会在下次git fetch时再次出现。

要停止提取这些远程跟踪分支,您需要明确指定要在.git / config中获取的引用:

 [remote "origin"] # fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/heads/master:refs/remotes/origin/master fetch = +refs/heads/develop:refs/remotes/origin/develop 

在上面的例子中,我们只提取masterdevelop分支,随意添加你的分支。