Как я могу развернуть/нажать только подкаталог моего репозитория git в Heroku?

У меня есть проект, который использует Serve и управляется версией с помощью Git. Служба создает папку output со статическими файлами, которые я хочу развернуть в Heroku.

Я не хочу развертывать сам проект Serve, так как стек Heedu Cedar не слишком любит его, но, самое главное, я хочу использовать преимущества Heroku для статических веб-сайтов.

Есть ли способ развернуть подпапку на удаленный git? Должен ли я создать репозиторий git в папке output (что звучит неправильно) и нажать его в Heroku?

Ответ 1

Есть еще более простой способ через git-subtree. Предполагая, что вы хотите нажимать свою папку "output" в качестве корня в Heroku, вы можете сделать:

git subtree push --prefix output heroku master

В настоящее время отображается, что git -subtree включен в git -core, но я не знаю, была ли еще выпущена версия git -core.

Ответ 2

У меня была аналогичная проблема. В моем случае никогда не было проблемой сдуть все в репозитории heroku и заменить его тем, что находится в моем подкаталоге. Если это ваш случай, вы можете использовать следующий bash script. Просто поместите его в каталог приложений Rails.

#!/bin/bash

#change to whichever directory this lives in
cd "$( dirname "$0" )"

#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku [email protected]:young-rain-5086.git

#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"

#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git

#go back to wherever we started.
cd -

Я уверен, что есть много способов улучшить это - так что не стесняйтесь рассказывать мне, как это сделать.

Ответ 3

Я начал с того, что поставил Джон Берриман, но на самом деле это может быть проще, если вы вообще не заботитесь о истории heroku git.

cd bin
git init
git add .
git commit -m"deploy"
git push [email protected]:your-project-name.git -f
rm -fr .git

Я думаю, что официальный git subtree - лучший ответ, но у меня возникла проблема с поддеревом для работы с моим mac.

Ответ 4

После долгого и трудного месяца, когда я понял,

только потому, что Heroku использует репозиторий git как механизм развертывания, вы не должны рассматривать его как хранилище git

он мог бы быть rsync так же хорошо, они пошли для git, не отвлекайтесь из-за этого

если вы это сделаете, вы откроете себе все виды обид. Все вышеупомянутые решения где-то удручающе:

  • это требует, чтобы что-то делалось каждый раз или периодически, или случались неожиданные вещи (подталкивание подмодулей, синхронизация поддеревьев,...)
  • Если вы используете двигатель, например, для модуляции вашего кода, Bundler будет есть вас в живых, невозможно описать количество разочарования, которое у меня было с этим проектом во время квеста, чтобы найти хорошее решение для этого
    • вы пытаетесь добавить движок как git ссылка репо + bundle deploy - сбой, вам нужно каждый раз связывать обновление
    • вы пытаетесь добавить двигатель как :path + bundle deploy - fail, команда разработчиков считает :path опцией как "вы не используете Bundler с этой опцией gem", поэтому она не будет связываться для производства
    • также, каждое обновление движка хочет обновить ваш rails stack -_-
  • Единственное решение, которое я нашел, - использовать движок в качестве символической ссылки /vendor в разработке и фактически скопировать файлы для производства

Решение

В рассматриваемом приложении есть 4 проекта в git root:

  • api - в зависимости от профиля будет работать на двух разных серверах heroku - upload и api
  • веб-сайт
  • веб-старый - старый веб-сайт, все еще находящийся в процессе миграции
  • common - общие компоненты, извлеченные в движке

Все проекты имеют символическую ссылку vendor/common, смотрящую на корень движка common. При компиляции исходного кода для развертывания в heroku нам необходимо удалить symlink и rsync его код, чтобы физически находиться в папке поставщика каждого отдельного хоста.

  • принимает список имен хостов в качестве аргументов
  • запускает git push в вашем репозитории разработки, а затем запускает чистый git pull в отдельной папке, убедившись, что никакие грязные (неуправляемые) изменения не будут автоматически перенесены на хосты
  • разворачивает хосты параллельно - ретрансляция каждого heroku git, новый код rsynced в нужные места, с базой данных push в комментарии git commit,
  • в конце концов, мы отправляем пинг с завитками, чтобы сообщить хобби хозяевам проснуться и завести журналы, чтобы посмотреть, все ли вина.
  • играет хорошо с jenkins: D (автоматический ввод кода для тестирования серверов после успешных тестов)

Работает очень хорошо в дикой природе с минимальными (нет?) проблемами через 6 месяцев

Здесь script https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f

Обновление 1

@AdamBuczynski, это никогда не бывает так просто.

1 у вас всегда будет производственная и тестовая среда, по крайней мере, и куча функциональных кластеров в худшем случае - внезапно одна папка должна отображать проекты n heroku в качестве довольно элементарного требования, и все это должно быть организовано так, чтобы script "знал", какой источник вы хотите развернуть, где

2nd вы захотите поделиться кодом между проектами - теперь идет часть sync_common, shennanigans с символическими ссылками в разработке, заменяемыми фактическим rsynced кодом на Heroku, потому что Heroku требует определенной структуры папок, а bundler и rubygems действительно действительно делают вещи уродливые очень плохо, если вы хотите извлечь общие потоки в драгоценный камень

3rd вы захотите подключить CI, и он немного изменится, как нужно организовать подпапки и git репо, в конце концов, в самом простом случае использования вы получите вышеупомянутый смысл.

В других проектах мне нужно подключить Java-сборки, когда вы продаете программное обеспечение нескольким клиентам, вам нужно будет фильтровать модули, которые устанавливаются в зависимости от требований к установке и еще чего-то,

Я действительно должен рассмотреть возможность объединения вещей в Rakefile или что-то еще и сделать все так...