我在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,但我不知道如何实现这一目标。
我的第一个方法是运行git push heroku :master
,但Heroku检测到这一点并拒绝它。
当然,我可以破坏应用程序并重新创建它,但是所有域名分配和附加组件也都消失了,我想避免这种情况。
还有其他想法吗?
答案 0 :(得分:46)
您可以嵌套git命令来执行强制推送。
对于您的情况,命令将是:
git push heroku `git subtree split --prefix website master`:master --force
答案 1 :(得分:2)
对于那些来自Yeoman(缺少)deployment guide来自这里的人来说,solution开发了一个更好,更好,更容易的X1011,我敦促大家让你的生活更轻松和使用它!
与已经容易发生问题的子树方法相比,此脚本实际上会在dist
/ build
/ release
分支上保留您的开发提交增量历史记录 - 而且,您甚至不需要跟踪开发分支中的dist
文件夹。
设置过程可能看起来令人生畏,但相信我,事实并非如此。我花了不到10分钟的时间进行设置,它在第一次运行时就像承诺的那样工作,即使在Windows机器上也是如此。
如果您想使用Grunt自动化它,这很容易。这就是我做到的:
deploy.sh
下载到您的主项目文件夹。grunt-shell
:npm install grunt-shell --save-dev
(--save-dev
会将grunt-shell
添加到项目的dev依赖项中,以防您不知道)。您也可以使用grunt-exec
,他们基本上做同样的事情,AFAIK。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');
}
});