Як я можу розгорнути / натиснути лише підкаталог свого git repo до Heroku?


121

У мене є проект, який використовує Serve і контролюється версією за допомогою Git. Serve створює outputпапку зі статичними файлами, які я хочу розгорнути в Heroku.

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

Чи є спосіб розгорнути підпапку на віддалений git? Чи потрібно створити Gpo repo в outputпапці (це звучить неправильно) і натиснути її на Heroku?


1
Ви можете шукати підмодулі: book.git-scm.com/5_submodules.html
greg0ire

Відповіді:


220

Є ще простіший спосіб через git-subtree . Припускаючи, що ви хочете натиснути папку «вихід» як корінь на Heroku, ви можете зробити:

git subtree push --prefix output heroku master

На даний момент, схоже, що git-subtree включається в git-core, але я не знаю, чи вийшла ще версія git-core.


1
Так, але піддерево все ще (станом на 1.8.0.2) не включено через інсталятор git . На щастя, встановлення з джерела - це швидке та просте, ця сторінка працювала для мене на Mac.
дрибнет

14
Якщо вам потрібно --force, використовуйте git push heroku `git subtree split --prefix output master`:master --force. Дивіться stackoverflow.com/a/15623469/2066546 .
fiedl

2
Але який правильний спосіб просунути певний тег. Я думав, що так і має бути git subtree push --prefix output heroku +refs/tags/v1.0.0:refs/heads/master. Але це не працює і повертається +refs/tags/v1.0.0:refs/heads/master does not look like a ref. Мені потрібен такий тип функціональності, щоб згодом мати можливість відтворювати роль певних тегів. Який правильний спосіб зробити це?
denis

1
Я отримую помилку "Оновлення було відхилено, оскільки висунутий наконечник гілки знаходиться позаду пульта"
Аллі

2
@ and-dev @Eric Burel Я успішно висунув outputпапку, яка була тільки в моїй developгілці, до heroku masterгілки, не потребуючи вказівки develop:master, тому, мабуть, вона підштовхується до цільової гілки, яку ви вказали з вашої перевіреної в даний час гілки.
cprcrack

10

Я почав з того, що поставив Джон Берріман, але насправді це може бути простіше, якщо ви зовсім не переймаєтесь історією heroku git.

cd bin
git init
git add .
git commit -m"deploy"
git push git@heroku.com:your-project-name.git -f
rm -fr .git

Я думаю, що офіційна git subtreeнайкраща відповідь, але у мене виникло питання про отримання піддерева для роботи над моїм Mac.


9

У мене було подібне питання. У моєму випадку ніколи не було проблем видувати все у сховищі героків та замінити його тим, що є у моєму підкаталозі. Якщо це ваш випадок, ви можете використовувати наступний скрипт bash. Просто покладіть його в каталог додатків 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 git@heroku.com: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 -

Я впевнений, що існує багато способів покращити це - тому сміливо скажіть мені, як!


+1Дякую. Це рішення чудово спрацьовує, якщо вас не цікавлять журнали git на Heroku. Можна налаштувати вище скрипт у випадку, якщо є кілька папок, які ви хочете проігнорувати, у межах додаткового шляху програми, який потрібно розгорнути. Наприклад, я не хотів specпапки на heroku. Example Gist
ch4nd4n

+1але ви можете спростити, не тягнучи і не злившись у майстра героїка, а напростоgit push --force heroku master
MK Safi

4

Після довгого і важкого місяця пробуючи різні речі і покусаючи щоразу, коли я зрозумів,

тільки тому, що Heroku використовує сховище git як механізм розгортання, не слід розглядати це як сховище git

це могло бути так само rsync, вони пішли на git, не відволікайтеся через це

якщо ти так зробиш, ти відкриваєш себе на всілякі ушкодження. Усі вищезазначені рішення десь збиваються:

  1. це вимагає що-небудь робити щоразу або періодично, або трапляються несподівані речі (натискання підмодулів, синхронізація підрядів, ...)
  2. якщо ви використовуєте двигун, наприклад, для модуляції свого коду, Bundler з'їсть вас живими, неможливо описати кількість розладів, які я мав з цим проектом під час квесту, щоб знайти гарне рішення для цього
    • ви намагаєтеся додати двигун як git repo link + bundle deploy- не вдається, вам потрібно оновлювати оновлення кожного разу
    • ви намагаєтеся додати двигун як :path+ bundle deploy- невдача, команда розробників розглядає :pathваріант як "ви не використовуєте Bundler з цим параметром дорогоцінного каміння", тому він не буде вбудовуватися для виробництва
    • також кожне оновлення двигуна хоче оновити стек рейок -_-
  3. Єдине знайдене нами рішення - використовувати двигун як /vendorсимпосилання в розробці і фактично копіювати файли для виробництва

Рішення

У додатку є 4 проекти з git root:

  1. api - залежно від профілю буде працювати на 2 різних хостках heroku - upload та api
  2. web - веб-сайт
  3. web-old - старий веб-сайт, який ще перебуває в міграції
  4. загальний - загальні компоненти, витягнуті в двигуні

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

  1. приймає список імен хостів як аргументи
  2. запускає git push у вашій розробці repo, а потім запускає чистий git pull в окрему папку, переконуючись, що ніякі брудні (невмілі) зміни автоматично не надсилаються на хости
  3. паралельно розгортає хостів - витягується кожен heroku git repo, новий код розміщується в потрібних місцях, передається основна інформація про push у коментарі git počin,
  4. Врешті-решт, ми відправляємо пінг із завитком, щоб сказати господарям хобі прокинутися та загорнути колоди, щоб побачити, чи все пішло на вино
  5. грає добре і з jenkins: D (автоматичне натискання коду для тестування серверів після успішних тестів)

Працює дуже добре на природі з мінімальними (ні?) Проблемами 6 місяців

Ось сценарій https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f

Оновлення 1

@AdamBuczynski, це ніколи не буває просто.

По-перше, у вас завжди буде виробнича і тестова середовище як мінімум - і купа функціональних кластерів у гіршому випадку - раптом 1 папка повинна відображатись на n героїків проектів як досить основну вимогу, і все це потрібно якось організувати, щоб сценарій "знає", яке джерело ви хочете розгорнути куди,

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

По-третє, ви захочете підключити CI, і це трохи змінить, як потрібно організувати підпапки та git repo, врешті-решт, у найпростішому можливому випадку використання ви закінчите вищезгаданий суть.

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

Я дійсно повинен розглянути питання зв'язання речей у Rakefile чи щось таке, і робити все так ...


Привіт @bbozo, ви хочете трохи згустити своє рішення і зробити його специфічним для випадку використання розгортання однієї конкретної підпапки в одному конкретному проекті heroku та вийняти всі речі, які не потрібні / характерні для Heroku?
Адам Рейс

Дякуємо за оновлення вашої відповіді. Я думаю, що я просто кусаю кулю і розділяю код клієнта та сервера на окремі сховища. Не ідеально підходить для нашої ситуації, але це буде перемагати вимушені підштовхування, які ми маємо робити зараз, і з того, що я збираю, також буде набагато простіше, ніж намагатися використовувати символьні посилання.
Адам Рейс

Не бійтеся "сценарію розгортання", це окупається
bbozo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.