如何将Heroku的Git仓库重置为初始状态?

21

我有一个在git仓库中的Web应用程序。由于历史原因,Web应用程序不在仓库的根目录下,而是在一个名为website的文件夹中。除此之外,还有一些其他文件夹,所以我有以下结构:

myApp
+- .git
+- otherFolder1
+- otherFolder2
+- otherFolder...
+- otherFolderN
+- website

该网站在Heroku上运行。由于Heroku要求您的Web应用程序位于git存储库的根目录中,因此我使用了一个构建过程,将website文件夹复制到完全不同(外部)具有自己的git存储库的文件夹中。然后,我就能从那里推送到Heroku,一切都很顺利。

现在,由于git包括subtree命令,这已经不再必要了,因为我可以直接从我的初始文件夹推送,但只需使用website子文件夹,如下所示:

git subtree push --prefix=website heroku master

基本上,这个方法是完美的。我只有一个问题:由于之前对Heroku的提交来自完全不同的git存储库,两者的历史记录不匹配 - 因此,Heroku检测到了非快进式推送,并拒绝了subtree推送。

那么我该怎么办呢?

  • 想法1:强制推送。试过了,但不起作用,因为git subtree push没有--force选项(或类似的选项)。
  • 想法2:清除Heroku的存储库,重新开始。

我很想尝试想法2,但我不知道如何实现。

我的第一步是运行git push heroku : master,但Heroku检测到了这一点并拒绝了它。

当然,我可以摧毁应用程序并重新创建它,但所有域分配和add-ons也会消失,我希望避免这种情况。

还有其他想法吗?


不确定是否适用于子树,但您可以先执行 git fetch heroku master,然后再执行 git merge -s ours heroku/master,最后再尝试推送子树。 - kev
谢谢你的提示。我已经这样做了,它完美地合并了,但是当我尝试推送时,我得到了完全相同的结果 :-/ - Golo Roden
很不幸,我对subtree还不熟悉,看起来有一个特定于subtree的pull请求,你能否从heroku的主分支中尝试一下? - Schneems
我遇到了同样的问题。你设法找到解决方案了吗?子树特定的拉取是否起作用了? - stian
很遗憾,我没有找到解决办法。我的做法是在Heroku上销毁应用程序并重新创建,然后进行子树推送。这个方法可行,但显然更像是一种解决方式而不是真正的解决方案 :-/ - Golo Roden
2个回答

54

你可以嵌套git命令来执行强制推送。

对于您的情况,命令将是:

git push heroku `git subtree split --prefix website master`:master --force

4
@Ivan,我遇到了完全相同的问题(不是关于Heroku的,而是我自己创建的子树噩梦),这解决了我的问题。然而,我不确定我理解它的作用(即您可以在其上添加:master并将其推送的子树输出是什么...您能否详细说明一下为什么/如何起作用?谢谢。 - Mikeage
@Sunyatasattva 如果我没记错的话,它所做的是将被推送的提交作为子树添加到主分支中,并完全覆盖整个分支历史记录,即已经存在于其中的所有内容都将丢失。 - pilau
3
在Windows上如何做这件事?我遇到了“错误:未知选项'prefix'”。 - pilau
@Sunyatasattva 是的,我有。我在Google上搜索了一下,找到了这里(http://www.damian.oquanta.info/posts/one-line-deployment-of-your-site-to-gh-pages.html)。请看底部的最后一个解决方案,它更加简洁,而且对我很有效! - pilau
1
有人能解释一下这个命令吗?它只是在删除主分支吗?嵌套的命令是做什么的?对我来说,它只是删除了主分支,但似乎没有运行“嵌套”的命令。 - Stop Slandering Monica Cellio
显示剩余11条评论

1

对于那些从Yeoman(缺乏)部署指南来到这里的人,有一个更好、更容易的解决方案X1011开发,我敦促你们所有人使生活更轻松,使用它!

与已经存在问题的子树方法相比,这个脚本实际上在你的dist/build/release分支上保留了你的开发提交差异历史,而且你甚至不需要在开发分支中跟踪dist文件夹。

设置过程可能看起来令人生畏,但相信我,它并不是。我花了不到10分钟就完成了设置,并且在第一次运行时就像承诺的那样正常工作,即使在Windows机器上也是如此。

如果你想用Grunt自动化它,那很容易。这就是我做的:

  1. 首先将 X1011 的 deploy.sh 下载到您的主项目文件夹中。
  2. 按照简短的配置和设置指南进行操作。
  3. 通过以下命令在节点上安装 grunt-shell: npm install grunt-shell --save-dev (--save-dev 将把 grunt-shell 添加到项目的开发依赖项中,以防您还不知道)。您也可以使用 grunt-exec,它们基本上做同样的事情,据我所知。
  4. Gruntfile.js 中,将以下对象添加到 initConfig 中:

添加到 initConfig 对象

    shell: {
        deployverbose: {
          command: 'sh deploy.sh -v',
          options: {
              stdout: true,
              stderr: true
          }
        },
        deploy: {
          command: 'sh deploy.sh',
          options: {
              stdout: true,
              stderr: true
          }
        }
    }

5. 注册一个新任务,或将其添加到现有的build任务中(请确保声明target参数):

将其添加到现有的构建任务中,命名为grunt build:deploy

if (target && target.indexOf('deploy') > -1) {
  tasks.push('deploy');
}

独立任务 grunt deploy,还可以使用--verbose标志:

grunt.registerTask('deploy', 'standalone deploy command', function () {
  if (grunt.option.flags().indexOf('--verbose') > -1) {
    grunt.task.run('shell:deployverbose');
  } else {
    grunt.task.run('shell:deploy');
  }
});

好的,我终于有时间尝试这个解决方案了,但是我无法让它工作。最初的设置让我非常困惑,当我按照说明进行操作时,发生的事情似乎完全与我想要实现的相反:我最终得到了一个断开连接的分支,其中包含我的工作目录中的每个文件,但是没有dist目录。 :/ - Sunyatasattva
你介意在X1011的GitHub库中提交一个问题吗?这样我们可以更容易地从那里开始解决。此外,请详细说明你到底做了什么,这样我们就可以找出可能出错的地方。 - pilau

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