我在两台不同的电脑(A和B)上工作,并在dropbox目录中存储了一个通用的git遥控器。
假设我有两个分支,master和devel。两者都在跟踪远程对应的origin/master和origin/devel。
现在在计算机A上,我删除分支devel,在本地和远程。
git push origin :heads/devel
git branch -d devel
在计算机A上运行git branch -a,我得到了下面的分支列表。
主
来源/头
来源/主
在计算机B上运行git取回,我可以用git branch -d devel删除本地devel分支,但我不能删除远程devel分支。
Git push origin:heads/devel返回以下错误消息。
错误:无法推送到不合格的目的地:heads/proxy3d
目标refspec既不匹配远程上现有的ref,也不以refs/开头,并且我们无法根据源ref猜测前缀。
致命的:对端意外挂机
Git branch -a仍然在远程分支中列出origin/devel。
如何清除计算机B上的远程分支?
我必须在这里加上一个答案,因为其他答案要么没有涵盖我的情况,要么是不必要的复杂。
我使用github与其他开发人员,我只是想要所有的本地分支机构,其远程(可能合并和)从一个github的PR删除从我的机器去删除。不,像git branch -r——merged这样的东西不包括没有在本地合并的分支,或者根本没有合并的分支(废弃的)等等,所以需要一个不同的解决方案。
不管怎样,我从其他答案中得到的第一步:
git fetch --prune
git remote prune origin的一个演练似乎在我的情况下会做同样的事情,所以我使用了最短的版本以保持简单。
现在,git分支-v应该将远程被删除的分支标记为[gone]。
因此,我所需要做的就是:
git branch -v|grep \\[gone\\]|awk '{print $1}'|xargs -I{} git branch -D {}
就像这样简单,它删除了上面场景中我想要的所有内容。
不太常见的xargs语法是,除了Linux,它还适用于Mac和BSD。
注意,这个命令不是一个演练,所以它将强制删除所有标记为[gone]的分支。显然,这是git什么都没有永远消失,如果你看到你想要保留的分支被删除,你可以随时取消删除它们(上面的命令将列出它们的哈希删除,所以一个简单的git checkout -b <branch> <hash>。
编辑:只需将这个别名添加到你的.bashrc/。bash_profile,这两个命令做成一个,我更新了第二个工作在所有的shell:
alias old_branch_delete='git fetch -p && git branch -vv | awk "/: gone]/{print \$1}" | xargs git branch -D'
我必须在这里加上一个答案,因为其他答案要么没有涵盖我的情况,要么是不必要的复杂。
我使用github与其他开发人员,我只是想要所有的本地分支机构,其远程(可能合并和)从一个github的PR删除从我的机器去删除。不,像git branch -r——merged这样的东西不包括没有在本地合并的分支,或者根本没有合并的分支(废弃的)等等,所以需要一个不同的解决方案。
不管怎样,我从其他答案中得到的第一步:
git fetch --prune
git remote prune origin的一个演练似乎在我的情况下会做同样的事情,所以我使用了最短的版本以保持简单。
现在,git分支-v应该将远程被删除的分支标记为[gone]。
因此,我所需要做的就是:
git branch -v|grep \\[gone\\]|awk '{print $1}'|xargs -I{} git branch -D {}
就像这样简单,它删除了上面场景中我想要的所有内容。
不太常见的xargs语法是,除了Linux,它还适用于Mac和BSD。
注意,这个命令不是一个演练,所以它将强制删除所有标记为[gone]的分支。显然,这是git什么都没有永远消失,如果你看到你想要保留的分支被删除,你可以随时取消删除它们(上面的命令将列出它们的哈希删除,所以一个简单的git checkout -b <branch> <hash>。
编辑:只需将这个别名添加到你的.bashrc/。bash_profile,这两个命令做成一个,我更新了第二个工作在所有的shell:
alias old_branch_delete='git fetch -p && git branch -vv | awk "/: gone]/{print \$1}" | xargs git branch -D'
考虑跑步:
git fetch --prune
定期在每个回购中删除一直跟踪已删除的远程分支(在远程GIT回购中不再存在)的本地分支。
这可以进一步简化为
git config remote.origin.prune true
这是一个per-repo设置,将使任何未来的git获取或git拉取自动修剪。
要为您的用户设置这个,您还可以编辑全局的.gitconfig并添加
[fetch]
prune = true
但是,建议使用以下命令完成:
git config --global fetch.prune true
或者在整个系统范围内应用它(不只是针对用户)
git config --system fetch.prune true