どうすればgitリポジトリのサブディレクトリのみをHerokuにデプロイ/プッシュできますか?


121

Serveを使用し、Gitを使用してバージョン管理されているプロジェクトがあります。Serveは、outputHerokuにデプロイする静的ファイルを含むフォルダーを作成します。

Heroku Cedarスタックはあまり好きではないので、Serveプロジェクト自体をデプロイしたくありませんが、最も重要なのは、静的Webサイトに対するHerokuの優れたサポートを利用したいことです。

サブフォルダーをgitリモートにデプロイする方法はありますか?outputフォルダーにGitリポジトリを作成し(間違っているように聞こえます)、それを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で動作しました。
dribnet

14
必要な場合は--force、を使用してくださいgit push heroku `git subtree split --prefix output master`:master --forcestackoverflow.com/a/15623469/2066546を参照してください。
fiedl 2014年

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 masterdevelop:master
cprcrack

9

同様の問題がありました。私の場合、herokuリポジトリのすべてを吹き飛ばして、サブディレクトリにあるもので置き換えることは問題になりませんでした。この場合は、次の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ありがとう。このソリューションは、Herokuのgitログを気にしない場合に最適です。デプロイするアプリケーションのサブパス内に、無視したいフォルダーがある場合は、上記のスクリプトを調整できます。たとえばspec、herokuにフォルダを作成したくありませんでした。
要旨の

+1しかし、herokuマスターにプルしてマージせずに、単純に単純化できますgit push --force heroku master
MK Safi

9

私はJohn Berrymanが書いたものから始めましたが、実際には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でサブツリーを機能させるのに問題がありました。


4

長く困難な月にさまざまなことを試し、気づくたびに噛まれた後、

Herokuがデプロイメントメカニズムとしてgitリポジトリを使用しているからといって、それをgitリポジトリとして扱わないでください。

それも同様にrsyncだったかもしれません、彼らはgitに行きました、これのために気が散ることはありません

そうすれば、あらゆる種類の傷を負うことになります。前述のソリューションはすべて、どこかで惨めに失敗します。

  1. 毎回、または定期的に実行する必要がある、または予期しないことが発生する(サブモジュールのプッシュ、サブツリーの同期など)
  2. たとえば、コードをモジュール化するためにエンジンを使用する場合、Bundlerはあなたを生きたまま食べます
    • エンジンをgit repoリンクとして追加しようとします+ bundle deploy-失敗し、毎回更新をバンドルする必要があります
    • エンジンを:path+ bundle deploy-失敗として追加しようとすると、開発チームは:pathオプションを「このgemオプションでBundlerを使用していない」と見なし、本番環境にバンドルされません
    • また、エンジンを更新するたびにRailsスタックが更新されます-_-
  3. 私が見つけた唯一の解決策は/vendor、開発でエンジンをシンボリックリンクとして使用し、実際に本番用にファイルをコピーすることです

ソリューション

問題のアプリには、git rootに4つのプロジェクトがあります。

  1. api-プロファイルに応じて、2つの異なるherokuホストで実行されます-アップロードとapi
  2. web-ウェブサイト
  3. web-old-移行中の古いウェブサイト
  4. common-エンジンで抽出された共通コンポーネント

すべてのプロジェクトにはvendor/commoncommonエンジンのルートを参照するシンボリックリンクがあります。herokuにデプロイするためのソースコードをコンパイルするときは、シンボリックリンクとrsyncを削除する必要があります。このコードは、物理的に各個別のホストのベンダーフォルダーにあるコードです。

  1. ホスト名のリストを引数として受け入れます
  2. 開発リポジトリでgit pushを実行してから、別のフォルダーでクリーンなgit pullを実行し、ダーティ(コミットされていない)変更がホストに自動的にプッシュされないようにします。
  3. ホストを並行してデプロイ-すべてのheroku gitリポジトリがプルされ、新しいコードが適切な場所にrsyncされ、git commitコメントの基本的なプッシュ情報でコミットされます、
  4. 最後に、カールを使ってpingを送信し、趣味のホストに目を覚まし、ログをテイルして、すべてがワインに移行したかどうかを確認します。
  5. jenkinsでもうまく機能します:D(テストの成功後にテストサーバーに自動コードプッシュ)

野生で非常にうまく動作し、6か月後の問題は最小限(いいえ)です。

これがスクリプトですhttps://gist.github.com/bbozo/fafa2bbbf8c7b12d923f

アップデート1

@AdamBuczynski、それは決して簡単なことではありません。

1つ目は、少なくとも本番環境とテスト環境が常にあり、機能が特定されていないクラスタが多数ある場合です。突然、1つのフォルダをn herokuプロジェクトにマップする必要があります。これは、かなり基本的な要件であり、すべてを何らかの方法で整理する必要があります。スクリプトは、どこにデプロイしたいソースを「知っている」か、

2つ目は、プロジェクト間でコードを共有することです。今度は、sync_commonHerokuに特定のフォルダー構造とバンドルとrubygemsが必要であるため、開発中のシンボリックリンクを含むshennaniganが実際のrsyncされたコードに置き換えられます。共通のスレッドを宝石に抽出したい

3番目に、CIをプラグインし、サブフォルダーとgit repoを整理する方法を少し変更します。最終的には、前述の要点で終了する最も単純な使用例です。

他のプロジェクトでは、Javaビルドをプラグインする必要があります。ソフトウェアを複数のクライアントに販売する場合、インストール要件などに応じて、インストールされるモジュールをフィルタリングする必要があります。

私は本当に物事をRakefileまたは何かにバンドルすることを検討し、すべてをそのようにする必要があります...


こんにちは@bbozo、ソリューションを少し凝縮して、特定のサブフォルダーを特定のherokuプロジェクトにデプロイして、Herokuに不要なもの/ Herokuに固有のものをすべて取り除くユースケースに固有のものにしてもよろしいですか?
Adam Reis

回答を更新していただきありがとうございます。弾丸をかじって、クライアント側とサーバー側のコードを別々のリポジトリに分割すると思います。私たちの状況には理想的ではありませんが、今やらなければならない強制サブツリープッシュに勝ります。また、私が収集したものから、シンボリックリンクを使用するよりもはるかに単純になります。
Adam Reis

「配備スクリプト」を恐れないでください。それは
報わ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.