我在两台不同的电脑(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分支-a在机器B上的结果是什么?

其次,你已经在原点上删除了heads/devel,所以这就是为什么你不能从机器B上删除它。

Try

git branch -r -d origin/devel

or

git remote prune origin

or

git fetch origin --prune

并且可以在git语句的末尾添加——dry-run,以查看在不实际运行它的情况下运行它的结果。

文件的git远程修剪和git分支。

其他回答

# First use prune --dry-run to filter+delete the local branches
git remote prune origin --dry-run \
  | grep origin/ \
  | sed 's,.*origin/,,g' \
  | xargs git branch -D

# Second delete the remote refs without --dry-run
git remote prune origin

从local-和remote-refs(在我的例子中是from origin)修剪相同的分支。

考虑跑步:

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/*

在上面的例子中,我们只获取主分支,开发和释放分支,可以根据需要随意调整。

该命令将“演练”删除除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

如果看起来不错,就去掉。此外,您可能希望先在fork上进行测试。

删除一直是一个具有挑战性的任务,可能是危险的!!因此,首先执行以下命令,看看会发生什么:

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

通过像上面那样做,git将为您提供一个列表,说明如果执行下面的命令将会发生什么。

然后执行以下命令,删除远程repo中不在本地repo中的所有分支:

git push --all --prune