Ответ 1
Вы можете вложить команды git для принудительного нажатия.
В вашем случае команда будет:
git push heroku `git subtree split --prefix website master`:master --force
У меня есть веб-приложение в репозитории git. По историческим причинам веб-приложение не находится в корне репозитория, оно находится в папке с именем website
. Кроме того, есть несколько других папок, так что у меня есть следующая структура:
myApp
+- .git
+- otherFolder1
+- otherFolder2
+- otherFolder...
+- otherFolderN
+- website
Веб-сайт работает на Heroku. Поскольку Heroku требует, чтобы ваше веб-приложение находилось в корне репозитория git, до сих пор я использовал процесс сборки, который скопировал папку website
в совершенно другую (внешнюю) папку со своим собственным хранилищем git. Тогда я смог оттолкнуть оттуда в Хереку, и все было в порядке.
Теперь, поскольку git включает в себя команду subtree
, это больше не нужно, поскольку я мог напрямую нажать из своей начальной папки, но только подпапку website
, используя:
git subtree push --prefix=website heroku master
В принципе, это работает отлично. У меня только одна проблема: поскольку предыдущие коммиты в Heroku пришли из совершенно другого репозитория git, история обоих не совпадает друг с другом - поэтому Heroku обнаруживает непереходное нажатие и отклоняет subtree
толчок.
Итак, как мне с этим справиться?
git subtree push
не имеет опции --force
(или ничего подобного).Мне бы хотелось пойти с идеей 2, но я понятия не имею, как этого добиться.
Мой первый подход состоял в том, чтобы запустить git push heroku :master
, но Heroku обнаруживает это и отрицает его.
Конечно, я мог бы уничтожить приложение и воссоздать его, но тогда все назначения и дополнения домена исчезли, и я хотел бы избежать этого.
Любые другие идеи?
Вы можете вложить команды git для принудительного нажатия.
В вашем случае команда будет:
git push heroku `git subtree split --prefix website master`:master --force
Для тех, кто приехал сюда из Yeoman (отсутствует) руководство по развертыванию, там намного, намного лучше и проще решение, разработанное X1011, и я призываю всех вас упростить вашу жизнь и использовать ее!
В отличие от уже подверженного методу поддерева, этот script на самом деле сохраняет историю развития дельта-истории развития на ветке dist
/build
/release
- и, вы даже не нужно отслеживать папку dist
в ветвях разработки.
Процесс установки может выглядеть пугающе, но, поверьте, это не так. Мне потребовалось менее 10 минут, чтобы настроить, и он просто работал как обещано в первом запуске даже на машине под Windows.
Если вы хотите автоматизировать его с помощью Grunt, это довольно просто. Вот как я это сделал:
deploy.sh
в свою основную папку проекта.grunt-shell
с помощью node с помощью этой команды: 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');
}
});