10

Git にリモート ディレクトリを設定して、ローカルにステージ ブランチをリモートにプッシュし、ステージング サーバー (stage.example.com など) でライブの変更を確認するにはどうすればよいですか?

私が持っている概念 (SVN から離れている理由の一部) は、次のように 3 つの異なる「メイン」ブランチを (ローカルで) 維持できるということです。

  • master - ローカル開発、作業ディレクトリに使用
  • stage - ステージング サーバー ディレクトリ (リモート) と同期する必要があります
  • live - これは一般にアクセス可能な Web サイト (リモート) である必要があります

私が持っているアイデア(および他の人が可能だと主張していること)は、リモートサーバーシェルに常にログインして実行する必要なく、ローカルコンピューターからこれらのリモート「サイト」を維持できるということですsvn update(現在のsvnワークフローでは、これをすべて行う必要があります時間…) またはもちろん、私の Git ワークフローgit pullではリモートで実行されます。

stageブランチをローカルにプッシュして(たとえば)すぐstaging remote serverに変更を確認できるように、リモート ディレクトリをセットアップするにはどうすればよいですか? stage.example.com

次に、stageすべてが正常でテストされたら、ローカルでpushリモートにアクセスして、ライブ Web サイトでliveテストしたこれらの変更を行うことができます。stage

これを行うことはできますか、それとも Git で行うことを意図していないクレイジーなアイデアをここで得ていますか?

これが重要な場合に備えて、ローカル サーバーとリモート サーバーに関するいくつかの統計を次に示します。

リモートサーバー: Dreamhost (共有アカウント)
リモート GIT バージョン: 1.7.1.1
リモート GIT クライアント: シェル

ローカル コンピューター: Mac Pro (Snow Leopard 10.6.6)
ローカル GIT バージョン: 1.7.2.3
ローカル GIT クライアント: Tower.app // git-tower.com

また、これまでのところ、次のワークフローの試行に失敗しました。

  1. --bareリモートで Git リポジトリを作成します(どこからでもアクセスできるようにします)
  2. このリモート リポジトリをローカル ディレクトリにクローンし、Git Tower アプリを使用して管理します
  3. 地元で働くmaster (HEAD)
  4. scp -r--bareリモート サーバーからリモート ライブ ドメインに git リポジトリをコピーするstage.example.com
  5. リモートをローカルの作業コピーに追加してから、プッシュを試みますorigin/stage

明らかにこれは機能しませんが、それを改善する理由や方法がわかりません。

SVN のバックグラウンドから来て、Git は初めてですが、チュートリアル(Peepcode & ThinkVitamin)をたくさん見ましたが、これを設定する方法がわかりません。

4

1 に答える 1

4

DVCS (Git や Mercurial などの「分散型」VCS) で実現する 1 つの概念は、分岐の概念にパブリケーション(プッシュ/プル)の概念を追加することです。
CVCS (SVN のような「集中型」VCS) には、分岐 (およびサーバーにプッシュするための 1 つの中央レポ) しかありません。

あなたの場合、ステージングまたはライブは公開ステップです。つまり、ステージングまたはライブ環境で見たい変更を受け取る準備ができている別の Git リポジトリです。

つまり、次のようになります。

  • stagingステージング (" " ブランチ) またはライブ (" live" ブランチ)に属するものを追跡する 2 つのブランチ
  • 1 つのリモート ベア リポジトリ (プッシュできるようにするためstaging、またはliveブランチのいずれかをプッシュします)
  • 作業ツリー(実際の「ステージング」または「ライブ」ファイルを表す)をチェックアウトして更新するためのベア リポジトリの1つの更新後フック
  • ベア リポジトリをリモートとして追加し、ステージングまたはライブにプッシュできる 1 つのローカル リポジトリ。
    また、作業が必要な他のローカル コンピューターにベア リポジトリを複製することもできます。

post-receiveフックとフックの違いは、ブランチが変更されるたびにpost-updateフックが 1 回実行されることです。「リモート サーバーにプッシュされたブランチに基づいてさまざまな Web フォルダを更新するための Git フック」SO の質問 を参照してください。post-update

最初のプッシュで " git push --all origin" を実行すると、すべてのブランチがリモートのベア リポジトリに作成されます。

アイデアは、サーバー側でプルを行うべきではないということです。更新後のフックのパラメーターに応じて、git --work-tree=/path/to/your/live/files/ checkout liveまたはのみgit --work-tree=/path/to/your/staging/files/ checkout stagingです。ベアリポジトリのファイルをサーバー上のこれらの「フォルダー」にチェックアウトするだけです。

フックに Ruby スクリプトを実行する場合は、次のことを確認してください。

  • 正しいシバンを使用してください: #!/usr/bin/env ruby,
  • git コマンドをバッククォートで囲むだけで十分です: `git ...`このスクリプトのように
  • またはのようなコマンドを(正しいパスに設定して)機能さENV['HOME']せたい場合は、上記のスクリプト内で現在のユーザーのホームディレクトリを指定するために使用します。`cd ~/stagedomain.com``--work-tree=~/stagedomain.com``~`
  • 選択した場合は、他の質問のように他のコマンドと同じ行git pullで設定を解除します。GIT_DIR`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage`
于 2011-04-02T06:01:16.290 に答える