20

我在 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推送。

那么我该如何处理呢?

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

我很想采用想法 2,但我不知道如何实现这一目标。

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

当然,我可以销毁应用程序并重新创建它,但是所有域分配和附加组件也都消失了,我想避免这种情况。

还有其他想法吗?

4

2 回答 2

53

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

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

git push heroku `git subtree split --prefix website master`:master --force
于 2012-11-15T18:10:58.030 回答
1

对于那些从 Yeoman(缺少)部署指南来到这里的人, X1011开发了一个更好、更简单的解决方案,我敦促大家让生活更轻松并使用它!

与已经很容易出现问题的子树方法相比,此脚本实际上在您的//分支上保留了您的开发提交增量历史-而且,您甚至不需要跟踪开发分支中的文件夹。distbuildreleasedist

设置过程可能看起来令人生畏,但相信我,事实并非如此。我花了不到 10 分钟的时间进行设置,而且它在第一次运行时就按承诺运行,即使在 Windows 机器上也是如此。

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

  1. 首先将 X1011 下载deploy.sh到您的主项目文件夹。
  2. 遵循简短的配置和设置指南。
  3. grunt-shell通过以下命令使用节点安装npm install grunt-shell --save-dev:(--save-dev将添加grunt-shell到项目的开发依赖项中,以防您还不知道)。你也可以使用grunt-exec,他们基本上做同样的事情,AFAIK。
  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');
  }
});
于 2013-10-15T06:29:21.047 回答