删除不存在于本地的远程分支

4
假设我独自工作,且仅使用远程作为代码备份解决方案。有时可能会删除本地分支。
我知道可以使用 git push origin --delete mybranch 删除特定的远程分支,但是否有一种方法可以删除所有不存在本地的远程分支,而无需手动检查本地不存在的分支?

1
只需编写一个脚本来完成此操作。使用 git for-each-ref(从 git fetch --prune 开始更新 Git 的远程跟踪分支)。 - torek
@torek是正确的,那可能是最好的方法,但你引起了我的兴趣,因为这与一般做法完全相反,你的用例是什么,你不想保留代码? - LightBender
@LightBender 我通常会进行本地提交,然后将所有分支推送到远程。有时在离线工作时,我会合并分支,然后删除旧的(已合并)分支。但是,旧的(已合并)分支仍将存在于远程。我正在寻找一种方法来保持本地和远程同步,以适应这种工作流程。 - Flux
你的意思是什么?你在用哪个远程设备? - LightBender
@LightBender 目前正在使用 GitHub 远程仓库。 - Flux
1个回答

2
有时在离线工作时,我会合并分支,然后删除旧的(已合并的)分支。最好在线上进行此操作,因为您可以跟进 push --delete,就像这个答案中所示
git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

但是,由于您已经在本地(离线)删除了您的分支,所以当您在线时,您需要从GitHub fetch --prune 远程分支,检查它们的本地副本是否存在,如果不存在,则push --delete
使用 git for-each-refrefname:lstrip=3 格式 来列出这些远程分支的短名称:
 git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin

您可以使用 git show-ref --quiet 命令检查 本地分支是否存在
if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

所以您可以轻松地将这两者结合起来。
git fetch --prune
for branch in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin); do
    if ! git show-ref --quiet refs/heads/${branch}; then
        echo "delete remote branch '${branch}'"
        git push origin --delete ${branch} 
    fi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接