我在两台不同的电脑(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上的远程分支?
考虑跑步:
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
如果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
这对于大型项目可能很有用,因为你不需要其他团队成员的功能分支,但在初始克隆中有许多远程跟踪分支。
但是,仅这一步是不够的,因为那些被删除的远程跟踪分支将在下次获取git时返回。
为了停止获取这些远程跟踪分支,你需要显式地在.git/config中指定要获取的引用:
[remote "origin"]
# fetch = +refs/heads/*:refs/remotes/origin/* ### don't fetch everything
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/develop:refs/remotes/origin/develop
fetch = +refs/heads/release/*:refs/remotes/origin/release/*
在上面的例子中,我们只获取主分支,开发和释放分支,可以根据需要随意调整。