【问题标题】:How do I reset a Heroku git repository to its initial state?如何将 Heroku git 存储库重置为其初始状态?
【发布时间】:2012-09-20 14:59:28
【问题描述】:

我在 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 检测到这一点并拒绝了它。

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

还有其他想法吗?

【问题讨论】:

  • 不知道它是否适用于子树,但您可以 git fetch heroku master 后跟 git merge -s ours heroku/master 然后尝试再次推送子树。
  • 感谢您的提示。我这样做了,它完美地合并了,但是当我尝试推动时,我得到了完全相同的结果:-/
  • 不幸的是,我是子树的新手,看起来有一个子树特定的拉动,你能从 heroku 的主分支中试一试吗?
  • 我遇到了同样的问题。您是否设法找到解决方案?子树特定的拉动是否有效?
  • 不幸的是我没有找到解决方案。我所做的是销毁 Heroku 上的应用程序并重新创建它,然后进行子树推送。这行得通,但当然它更多的是一种解决方法而不是解决方案:-/

标签: git heroku


【解决方案1】:

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

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

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

【讨论】:

  • @Ivan,我遇到了完全相同的问题(不是 Heroku,而是我自己创造的子树噩梦),这解决了它。不过,我不确定我是否理解这是做什么的(即,您可以添加 :master 然后推送它的子树的输出是什么……您能详细说明一下为什么/如何工作吗?谢谢。
  • @Sunyatasattva 如果我没记错的话,它所做的是将提交作为子树推送到主分支,并完全覆盖整个分支历史记录,即其中的所有内容都将丢失。
  • 但是如何在 Windows 上做到这一点?我收到error: unknown option 'prefix'
  • @pilau 这似乎是一个非常可怕的运行命令。然而,如果没有这个,我还没有设法让这种 subtree for deployment 之类的东西工作;这个想法很棒,但我认为实现有点花哨。
  • 有人能解释一下这个命令吗?它只是删除主分支吗?嵌套命令在做什么?对我来说,它只是删除了 master 分支,即 :shrug: 但它似乎没有运行“嵌套”命令。
【解决方案2】:

对于那些从 Yeoman(缺乏)deployment guide 来到这里的人,solutionX1011 开发,我敦促大家让生活更轻松并使用它!

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

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

如果您想使用 Grunt 将其自动化,这很容易。我就是这样做的:

  1. 首先将 X1011 的 deploy.sh 下载到您的主项目文件夹。
  2. 遵循简短的配置和设置指南。
  3. 通过以下命令使用节点安装grunt-shellnpm 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');
  }
});

【讨论】:

  • 好的,我终于有时间尝试这个解决方案,但我无法让它工作。初始设置让我非常困惑,当我按照说明操作时发生的事情似乎与我想要实现的完全相反:我最终得到了一个断开连接的分支,其中每个文件都在我的工作目录中 但是 dist 目录。 ://
  • 您介意在 X1011 的 GitHub 存储库中打开一个问题吗?从那里拿走它会容易得多。另外请详细说明您到底做了什么,以便我们查明哪里出了问题。
猜你喜欢
  • 2018-04-12
  • 2019-03-30
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多