清理旧的远程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
在上面的例子中,我们只提取master
和develop
分支,随意添加你的分支。