首页 > 解决方案 > 使用 `git push origin :branch-name` 有条件地删除远程分支 ...但前提是分支存在?

问题描述

我的问题的简短版本:

git push origin :gh-pages如果 gh-pages 分支不存在,是否可以使用跳过或忽略命令的位置有条件地删除远程分支?

我的问题的长版本:

我正在构建一个样板/入门模板,用于使用 NPM 作为构建系统或工作流来构建基本网页(而不是使用 Grunt 或 Gulp 之类的东西)。该项目使用一个/build文件夹,我想使用 Github Pages 来提供/build. 从 /settings 似乎没有一个简单的方法来做到这一点(我只看到 /root,而不是 /build),所以我遇到了这个命令:

git subtree push --prefix build origin gh-pages

它创建了一个gh-pages分支并将我的更改从我的主分支的文件夹推/build送到新创建的gh-pages分支。出色的!

不幸的是,我不能简单地gh-pages用更改来更新我的分支(我也不想这样做)。我也无法进行更改master,然后将它们合并到gh-pages. 我收到很多错误消息,分支不相关、不同步或其他。

相反,我需要进行更改,master然后git subtree push --prefix build origin gh-pages再次使用该命令来推送这些更改。但是我遇到了另一个错误,它不想将新更改推送到现有gh-pages分支中。

好的......所以为了解决这个问题,我添加git push origin :gh-pages到我的命令中。所以现在我的 package.json 中的“部署”命令看起来像这样:

  "scripts": {
    ...
    "deploy": "git push origin :gh-pages && git subtree push --prefix build origin gh-pages",
    ...
  },

这很好用。我只需输入npm run deploy我的终端并git push origin :gh-pages删除现有gh-pages分支并使用我的更改git subtree push --prefix build origin gh-pages创建一个新分支。gh-pages出色的!

但是......我似乎无法弄清楚的最后一个问题是这个。如果是第一次运行 deploy 命令,则 gh-pages 分支将不存在,并且我的部署脚本将失败。

那么有没有办法有条件地运行该git push origin :gh-pages部分?像if origin gh-pages exists ... git push origin :gh-pages什么?

顺便说一句,以这种方式删除分支(使用前导冒号)对我来说是全新的。并且git-push 手册页没有很好地解释它。要了解git push origin :gh-pages删除gh-pages分支的结果,请查看此链接

如果它可能有帮助,这里是repo。package.json 文件是部署脚本所在的位置。

标签: gitgithubgithub-pagesgit-branch

解决方案


如果失败,您可以简单地调用 push-to-delete 并继续。这是粗略的——当且仅当它由于分支不存在而失败时才继续更好——但可以使用。即使命令失败也要继续,请使用git push origin :gh-pages; git subtree push --prefix build origin gh-pages.

我不会推荐这种方法(无论有没有更聪明的方法来检测“理想的失败”)。您在自己的评论中链接的同一个评论线程中还有另一个解决方案,其中提到了这种方法:

git push origin `git subtree split --prefix build_folder master`:gh-pages --force

这有点短和简单。请注意,这使用build_folder而不是build; 如果我们让它匹配,并使用+语法来实现强制推送和$(...)我发现比反引号语法更好的语法,我们得到:

git push origin +$(git subtree split --prefix build master):gh-pages

如果git subtree split自身有可能失败,请使用:

hash=$(git subtree split --prefix build master) && git push origin +$hash:gh-pages

如果您想要一个名为 的本地分支gh-pages,请使用:

hash=$(git subtree split --prefix build master) && git branch -f gh_pages $hash && git push -f origin gh-pages

例如。


推荐阅读