修剪源分支在上游不再存在

gki*_*iko 1 git git-branch git-fork

这些分支在上游

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/gh-pages
  remotes/origin/master
  remotes/origin/next
  remotes/origin/translation
  remotes/origin/v1.0.1
  remotes/origin/videoConverter
Run Code Online (Sandbox Code Playgroud)

这些是我叉子上的树枝

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/beta
  remotes/origin/dashboardNewContent
  remotes/origin/externalUrl
  remotes/origin/gh-pages
  remotes/origin/master
  remotes/origin/next
  remotes/origin/rc
  remotes/origin/rc-0.3.0
  remotes/origin/release-candidate
  remotes/origin/streama-node
  remotes/origin/translation
  remotes/origin/v1.0.0
  remotes/origin/videoConverter
  remotes/upstream/gh-pages
  remotes/upstream/master
  remotes/upstream/next
  remotes/upstream/translation
  remotes/upstream/v1.0.1
  remotes/upstream/videoConverter
Run Code Online (Sandbox Code Playgroud)

自从我分叉以来,上游仓库已更新。我找不到从上游删除不再存在的分支的方法。该GitHub教程显示了如何同步提交历史记录。

是否有解决此问题的简单方法?

Von*_*onC 6

一个技巧是originupstreamurl 替换本地存储库(引用您的fork)中的:

git remote rename origin ori
git remote add origin $(git remote get-url upstream)
Run Code Online (Sandbox Code Playgroud)

然后,一个命令git fetch --prune将在本地删除所有过时的远程跟踪分支(remotes/origin/xxx不在内upstream,暂时由'引用origin

最后,您可以为每个remotes/ori/xxx分支检查是否remotes/origin/xxx存在。如果不是:git push --delete ori xxx

类似于:(以bash表示)

for f in $(git for-each-ref refs/remotes/ori --format '%(refname:short)' |
       sed 's,ori/,,') do;
   git rev-parse -q --verify refs/remotes/origin/$f >/dev/null || 
      git push --delete ori ${f}
done
Run Code Online (Sandbox Code Playgroud)

该脚本可以放在git-cleanup(或任何git-xxx名称)中,并以git cleanup(或git xxx)调用。这样,它甚至可以在Windows上以自己的bash运行。

完成:

git remote remove origin
git remote rename ori origin
Run Code Online (Sandbox Code Playgroud)