Как сбросить репозиторий Heroku git в исходное состояние?

18

У меня есть веб-приложение в репозитории 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 обнаруживает немедленный push-push и отклоняет push subtree .

Итак, как мне с этим справиться?

  • Идея 1: принудительное нажатие. Пробовал это, но не работает, поскольку git subtree push не имеет опции --force (или что-то подобное).
  • Идея 2: Очистить хранилище Heroku и начать с нуля.

Мне бы хотелось пойти с идеей 2, но я понятия не имею, как этого добиться.

Мой первый подход состоял в том, чтобы запустить git push heroku :master , но Heroku обнаруживает это и отрицает его.

Конечно, я мог бы уничтожить приложение и воссоздать его, но тогда все назначения и дополнения домена исчезли, и я хотел бы избежать этого.

Любые другие идеи?

    
задан Golo Roden 28.09.2012 в 19:43
источник
  • dunno, если он работает с поддеревом, но вы можете git fetch heroku master, за которым следует git merge -s ours heroku / master, а затем пытаемся снова нажать поддерево. –  kev 28.09.2012 в 19:58
  • Спасибо за ваш намек. Я сделал это, он слился отлично, но когда я попытался нажать, я получил тот же результат: - / –  Golo Roden 29.09.2012 в 05:45
  • К сожалению, я новичок в поддереве, похоже, что есть поддерево определенного тяги, не могли бы вы дать этот выстрел из мастер-ветки от героку? –  Schneems 01.10.2012 в 06:57
  • Я собираюсь попробовать :-) –  Golo Roden 01.10.2012 в 19:04
  • У меня такая же проблема. Удалось ли вам найти решение? Работает ли поддерево? –  stian 10.10.2012 в 12:54

2 ответа

41

Вы можете вложить команды git для принудительного нажатия.

В вашем случае команда будет:

git push heroku 'git subtree split --prefix website master':master --force
    
ответ дан Ivan Saskor 15.11.2012 в 19:10
  • Отлично, спасибо большое :-) –  Golo Roden 16.11.2012 в 11:17
  • @ Иван, у меня была такая же проблема (не с герокой, а с кошмаром подделки моего собственного творения), и это исправлено. Я не уверен, что понимаю, что это было (хотя, например, что такое вывод поддерева, который вы можете добавить: master, а затем нажмите его ... можете ли вы немного рассказать о том, почему и как это работает? Спасибо. –  Mikeage 19.02.2013 в 06:07
  • Я хотел бы добавить свой голос, чтобы получить лучшее объяснение. Здесь представлены документы Йомена, и ужасно иметь только эту строку кода в качестве ответа, который кажется взломанным. –  Sunyatasattva 06.10.2013 в 05:20
  • Но как это сделать в Windows? Я получаю сообщение об ошибке: неизвестный параметр 'prefix' –  pilau 09.10.2013 в 14:16
  • может кто-нибудь объяснить эту команду? Это просто удаление главной ветки? что делает вложенная команда? Для меня он просто удаляет главную ветвь, которая является: shrug: но, похоже, она не запускает «вложенную» команду. –  sequoia mcdowell 17.02.2016 в 04:09
Показать остальные комментарии
2

Для тех, кто приехал сюда из Yeoman's (отсутствует) руководство по развертыванию , есть намного, намного лучше и проще решение , разработанное X1011 , и я настоятельно призываю вас всех чтобы сделать вашу жизнь проще и использовать ее!

В отличие от уже подверженного методу поддерева, этот скрипт фактически сохраняет историю развития дельта-истории развития на вашей dist / build / release ветке - и, t даже нужно отслеживать папку dist в ваших ветвях разработки.

Процесс установки может выглядеть пугающе, но поверьте мне, это не так. Мне потребовалось менее 10 минут, чтобы настроить, и он просто работал как обещано в первом запуске даже на машине под Windows.

Если вы хотите автоматизировать его с помощью Grunt, это довольно просто. Вот как я это сделал:

  1. Сначала загрузите X1011 deploy.sh в основную папку проекта.
  2. Следуйте краткой инструкции по настройке и настройке.
  3. Установите grunt-shell с узлом с помощью этой команды: npm install grunt-shell --save-dev ( --save-dev добавит grunt-shell к зависимостям dev вашего проекта, если вы еще этого не знаете). Вы также можете использовать 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');
  }
});
    
ответ дан pilau 15.10.2013 в 08:29
  • Хорошо, я наконец нашел время, чтобы попробовать это решение, и я не могу заставить это работать. Начальная настройка меня очень смущает, и то, что происходит со мной, когда я следую инструкциям, кажется совершенно противоположным тому, чего я пытаюсь достичь: в итоге у меня отключена ветвь, в которой есть каждый файл в моей рабочей директории, но каталог dist. : / –  Sunyatasattva 19.10.2013 в 07:25
  • Не возражаете ли вы открыть проблему в репозитории GitHub X1011? Оттуда это будет намного легче. Также, пожалуйста, подробно изложите, что именно вы сделали, чтобы мы могли точно определить, где что-то могло пойти не так. –  pilau 19.10.2013 в 11:58