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

Conditionally delete a remote branch using `git push origin :branch-name` ... but only if branch exists?

我的问题的简短版本:

有没有办法使用 git push origin :gh-pages 有条件地删除远程 b运行ch,如果 gh-pages b运行ch 不存在,则跳过或忽略该命令?

我的问题的长版:

我正在构建样板/入门模板,以使用 NPM 作为构建系统或构建基本网页的工作流(而不是使用 G运行t 或 Gulp 之类的东西)。该项目使用 /build 文件夹,我想使用 Github 页面来提供 /build 的内容。从 /settings(我只看到 /root,没有看到 /build)似乎没有简单的方法,所以我 运行 通过这个命令:

git subtree push --prefix build origin gh-pages

创建一个 gh-pages b运行ch 并将我的更改从我的主 b运行ch 的 /build 文件夹推送到新创建的 gh-pages b运行ch。太棒了!

不幸的是,我不能简单地用更改来更新我的 gh-pages b运行ch(我也不想这样做)。我也无法在 master 中进行更改,然后将它们合并到 gh-pages 中。我收到很多关于 b运行ches 不相关、不同步等的错误消息。

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

好的...所以为了解决这个问题,我在我的命令中添加了 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 b运行ch 并且 git subtree push --prefix build origin gh-pages 创建一个新的 gh-pages b运行ch 我的改变。太棒了!

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

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

顺便说一句,以这种方式(使用前导冒号)删除 b运行ch 对我来说是全新的。还有 git-push man page didn't explain it well. To understand how git push origin :gh-pages results in deleting the gh-pages branch, take a look at this link.

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

可以简单地调用一键删除并在失败时继续。这是粗略的——当且仅当由于分支不存在而失败但可用时,才继续进行会更好。要在命令失败时继续,请使用 git push origin :gh-pages; git subtree push --prefix build origin gh-pages.

虽然我不推荐这种方法(有或没有更聪明的东西来检测“理想的失败”)。在同一个 comment thread you linked in 中还有另一个解决方案提到了这个方法:

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

例如。