417

を使用して Web サイトを展開することは可能git pushですか? gitフックを使用してサーバー側で実行することに関係があると思いgit reset --hardますが、これを達成するにはどうすればよいですか?

4

19 に答える 19

289

このスクリプトこのサイトで見つけましたが、非常にうまく機能しているようです。

  1. .git ディレクトリを Web サーバーにコピーします。
  2. ローカル コピーで、.git/config ファイルを変更し、Web サーバーをリモートとして追加します。

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. サーバーで、 .git/hooks/post-update をこのファイルに置き換えます(以下の回答で)

  4. ファイルへの実行アクセスを追加します (サーバー上で):

    chmod +x .git/hooks/post-update
    
  5. ここで、Web サーバーにローカルにプッシュするだけで、作業コピーが自動的に更新されます。

    git push production
    
于 2008-11-29T07:37:25.777 に答える
83

以下の更新後のファイルを使用します。

  1. .git ディレクトリを Web サーバーにコピーします。
  2. ローカル コピーで、.git/config ファイルを変更し、Web サーバーをリモートとして追加します。

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. サーバーで、.git/hooks/post-update を以下のファイルに置き換えます。

  4. ファイルへの実行アクセスを追加します (サーバー上で):

    chmod +x .git/hooks/post-update
    
  5. ここで、Web サーバーにローカルにプッシュするだけで、作業コピーが自動的に更新されます。

    git push production
    
#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update". 
git-update-server-info 
is_bare=$(git-config --get --bool core.bare) 
if [ -z "$is_bare" ]
then
      # for compatibility's sake, guess
      git_dir_full=$(cd $GIT_DIR; pwd)
      case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi 
update_wc() {
      ref=$1
      echo "Push to checked out branch $ref" >&2
      if [ ! -f $GIT_DIR/logs/HEAD ]
      then
             echo "E:push to non-bare repository requires a HEAD reflog" >&2
             exit 1
      fi
      if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
      then
             wc_dirty=0
      else
             echo "W:unstaged changes found in working copy" >&2
             wc_dirty=1
             desc="working copy"
      fi
      if git diff-index --cached HEAD@{1} >/dev/null
      then
             index_dirty=0
      else
             echo "W:uncommitted, staged changes found" >&2
             index_dirty=1
             if [ -n "$desc" ]
             then
                   desc="$desc and index"
             else
                   desc="index"
             fi
      fi
      if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
      then
             new=$(git rev-parse HEAD)
             echo "W:stashing dirty $desc - see git-stash(1)" >&2
             ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
             git-update-ref --no-deref HEAD HEAD@{1}
             cd $GIT_WORK_TREE
             git stash save "dirty $desc before update to $new";
             git-symbolic-ref HEAD "$ref"
             )
      fi 
      # eye candy - show the WC updates :)
      echo "Updating working copy" >&2
      (cd $GIT_WORK_TREE
      git-diff-index -R --name-status HEAD >&2
      git-reset --hard HEAD)
} 
if [ "$is_bare" = "false" ]
then
      active_branch=`git-symbolic-ref HEAD`
      export GIT_DIR=$(cd $GIT_DIR; pwd)
      GIT_WORK_TREE=${GIT_WORK_TREE-..}
      for ref
      do
             if [ "$ref" = "$active_branch" ]
             then
                   update_wc $ref
             fi
      done
fi
于 2010-08-02T10:53:18.337 に答える
61

失敗と行き詰まりを何度も経験した後、この記事のおかげで、ようやく "git push remote " だけで Web サイトのコードをデプロイできるようになりました。

著者の更新後スクリプトの長さは 1 行だけであり、彼のソリューションでは、Git リポジトリを非表示にするために .htaccess 構成を必要としません。

これを Amazon EC2 インスタンスにデプロイする場合、いくつかの障害があります。

1) sudo を使用して裸の宛先リポジトリを作成する場合、リポジトリの所有者を ec2-user に変更する必要があります。そうしないと、プッシュが失敗します。(「chown ec2-user:ec2-user repo 」を試してください。)

2) amazon-private-key .pem の場所を、/etc/ssh/ssh_config で IdentityFile パラメータとして、または ~/.ssh/config で "[ Host] - HostName - IdentityFile - User"ここで説明するレイアウト...

...ただし、ホストが ~/.ssh/config で構成されていて、ホスト名と異なる場合、Git プッシュは失敗します。(これはおそらく Git のバグです)

于 2011-03-03T06:31:02.370 に答える
21

サーバーに git をインストールしたり、そこに .git フォルダーをコピーしたりしないでください。git クローンからサーバーを更新するには、次のコマンドを使用できます。

git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project

プロジェクトから削除されたファイルを削除する必要がある場合があります。

これにより、チェックインされたすべてのファイルがコピーされます。とにかく、rsyncはサーバーにインストールされているsshを使用します。

サーバーにインストールするソフトウェアが少ないほど、サーバーはより安全になり、構成の管理と文書化が容易になります。サーバー上に完全な git クローンを保持する必要もありません。すべてを適切に保護することがより複雑になるだけです。

于 2011-08-24T06:54:09.413 に答える
12

本質的に、あなたがする必要があるのは次のことだけです:

server = $1
branch = $2
git push $server $branch
ssh <username>@$server "cd /path/to/www; git pull"

これらの行は、アプリケーションに という実行可能ファイルとして含まれていますdeploy

したがって、デプロイを実行したいときは、 と入力し./deploy myserver mybranchます。

于 2010-05-10T21:33:23.407 に答える
12

git config --local receive.denyCurrentBranch updateInstead

Git 2.3 で追加されました

サーバーリポジトリに設定すると、クリーンな場合は作業ツリーも更新されます。

2.4 では、push-to-checkout未発生のブランチのフックと処理により、さらに改善されています。

使用例:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

出力:

a
b

これには、GitHub の発表で言及されている次の欠点があります。

  • サーバーには、プロジェクトの全履歴を含む .git ディレクトリが含まれます。おそらく、ユーザーに提供できないことをさらに確認したいでしょう!
  • 展開中に、一部のファイルが古いバージョンに残りのファイルが新しいバージョンにある、または途中で書き込まれたファイルなど、一貫性のない状態のサイトにユーザーが一時的に遭遇する可能性があります。これがプロジェクトの問題である場合、プッシュ デプロイはおそらく適切ではありません。
  • プロジェクトに「ビルド」ステップが必要な場合は、おそらく githooks を介して明示的に設定する必要があります。

しかし、これらの点はすべて Git の範囲外であり、外部コードで処理する必要があります。その意味で、これは Git フックと合わせて究極のソリューションです。

于 2015-02-07T10:51:05.653 に答える
9

私が行う方法は、変更をプッシュする展開サーバーに裸の Git リポジトリを用意することです。次に、デプロイメント サーバーにログインし、実際の Web サーバーの docs ディレクトリに移動して、git pull を実行します。これを自動的に行うためにフックを使用していません。

于 2008-11-10T21:16:41.143 に答える
5

更新: 現在、Lloyd Mooreソリューションを key agent と共に使用していますssh -A ...。メインリポジトリにプッシュしてから、すべてのマシンから並行してプルすると、少し速くなり、それらのマシンでのセットアップが少なくて済みます。


ここにこのソリューションが表示されていません。git がサーバーにインストールされている場合は、ssh 経由でプッシュするだけです。

ローカルの .git/config に次のエントリが必要です

[remote "amazon"]
    url = amazon:/path/to/project.git
    fetch = +refs/heads/*:refs/remotes/amazon/*

でもねえ、それはamazon:何ですか?ローカルの ~/.ssh/config に、次のエントリを追加する必要があります。

Host amazon
    Hostname <YOUR_IP>
    User <USER>
    IdentityFile ~/.ssh/amazon-private-key

今、あなたは呼び出すことができます

git push amazon master
ssh <USER>@<YOUR_IP> 'cd /path/to/project && git pull'

(ところで: /path/to/project.git は実際の作業ディレクトリ /path/to/project とは異なります)

于 2011-11-26T16:21:00.500 に答える
5

展開シナリオの場合

このシナリオでは、コードを github/bitbucket に保存しており、ライブ サーバーにデプロイしたいと考えています。この場合、次の組み合わせが機能します(これは、ここで非常に支持された回答のリミックスです)

  1. .gitディレクトリを Web サーバーにコピーします
  2. ローカル コピーgit remote add live ssh://user@host:port/folder
  3. リモートで:git config receive.denyCurrentBranch ignore
  4. リモートで:nano .git/hooks/post-receive次のコンテンツを追加します。

    #!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f

  5. リモートで:chmod +x .git/hooks/post-receive

  6. 今、あなたはそこにプッシュすることができますgit push live

ノート

  • このソリューションは、古いバージョンの git で動作します (1.7 および 1.9 でテスト済み)。
  • 最初に github/bitbucket に確実にプッシュする必要があるため、ライブで一貫したレポが得られます
  • .gitフォルダーがドキュメント ルート内にある場合は、 .htaccess( source )に追加して外部から非表示にします。

    RedirectMatch 404 /\..*$

于 2015-10-17T09:45:01.577 に答える
5

デプロイの管理にはcapistranoを使用します。カピストラーノをビルドしてステージング サーバーにデプロイし、すべてのサーバーで rsync を実行します。

cap deploy
cap deploy:start_rsync (when the staging is ok)

capistrano を使用すると、バグが発生した場合に簡単にロールバックできます

cap deploy:rollback
cap deploy:start_rsync
于 2012-11-29T18:16:38.977 に答える
2

Giddyupは、言語に依存しない、水を追加するだけのgit フックで、git push を介して展開を自動化します。また、Web サーバーの再起動、キャッシュのウォームアップなどのためのカスタムの開始/停止フックを使用することもできます。

https://github.com/mpalmer/giddyup

をご覧ください。

于 2011-10-11T14:15:01.407 に答える
1

おそらく、「安定した」ブランチを言うためにコミットが行われると、変更をプルしてPHPサイトに適用するgitフックを設定することができます。大きな欠点は、何か問題が発生した場合に制御できなくなり、テストに時間がかかることです。ただし、トランクブランチを安定したブランチにマージすると、どのくらいの作業が必要になるかを知ることができます。遭遇する可能性のある競合の数。1つのサイトのみを実行する場合を除いて、サイト固有のファイル(構成ファイルなど)を監視することが重要です。

または、代わりにサイトに変更をプッシュすることを検討しましたか?

gitフックの詳細については、githooksのドキュメントを参照してください。

于 2008-11-18T20:28:04.740 に答える
1

私はtoroid.orgによる次のソリューションを使用しています。これには、より単純なフック スクリプトがあります。

サーバー上:

$ mkdir website.git && cd website.git
$ git init --bare
Initialized empty Git repository in /home/ams/website.git/

サーバーにフックをインストールします。

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
GIT_WORK_TREE=/var/www/www git clean -f -d # clean directory from removed files

$ chmod +x hooks/post-receive

あなたのクライアントで:

$ mkdir website && cd website
$ git init
Initialized empty Git repository in /home/ams/website/.git/
$ echo 'Hello, world!' > index.html
$ git add index.html
$ git commit -q -m "The humble beginnings of my web site."

$ git remote add web ssh://server.example.org/home/ams/website.git
$ git push web +master:refs/heads/master

次に、公開するには、入力するだけです

$ git push web

Web サイトに完全な説明があります: http://toroid.org/ams/git-website-howto

于 2014-03-21T11:43:43.870 に答える
1

サーバー上に 2 つのコピーが必要なようです。プッシュ/プルできるベア コピー。完了したら変更をプッシュします。次に、これを Web ディレクトリに複製し、cronjob を設定して Web ディレクトリから毎日 git pull を更新するか、それで。

于 2008-11-18T19:43:59.977 に答える
0

最終的に、リポジトリから新しい更新を自動的にプルダウンする独自の基本的なデプロイツールを作成しました-https ://github.com/jesalg/SlimJim-基本的に、github post-receive-hookをリッスンし、プロキシを使用してトリガーしますスクリプトを更新します。

于 2012-05-07T20:50:18.473 に答える
0

複数の開発者が同じリポジトリにアクセスする環境では、次のガイドラインが役立つ場合があります。

すべての開発者が属する UNIX グループがあることを確認し、.git リポジトリの所有権をそのグループに付与します。

  1. サーバー リポジトリの .git/config で、sharedrepository = true を設定します。(これは、コミットとデプロイに必要な複数のユーザーを許可するように git に指示します。

  2. bashrc ファイル内の各ユーザーの umask を同じに設定します - 002 が良いスタートです

于 2011-09-16T11:04:30.637 に答える