【问题标题】:Conditionally delete a remote branch using `git push origin :branch-name` ... but only if branch exists?使用 `git push origin :branch-name` 有条件地删除远程分支 ...但仅当分支存在时?
【发布时间】:2021-05-02 23:22:45
【问题描述】:

我的问题的简短版本:

有没有办法使用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 deploygit 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 man page 并没有很好地解释它。要了解git push origin :gh-pages 如何导致删除gh-pages 分支,请查看this link

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

【问题讨论】:

  • 另外,原来的解决方案来自gist.github.com/cobyism/4730490#gistcomment-1851849。我想发布它来感谢@mikeyhogarth 并提供额外的背景信息,以防其他人遇到同样的问题并且想知道我最初在哪里找到了部分解决方案。
  • git branch -r|grep origin/gh-pages
  • git push docs explains :gh-pages 非常详细。您的情况是“推送一个空的 允许您从远程存储库中删除 引用。

标签: git github github-pages git-branch


【解决方案1】:

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

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

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

例如。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2021-08-15
    • 2011-10-10
    • 2011-07-02
    • 2017-04-25
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多