を使用して Web サイトを展開することは可能git push
ですか? gitフックを使用してサーバー側で実行することに関係があると思いgit reset --hard
ますが、これを達成するにはどうすればよいですか?
19 に答える
このスクリプトはこのサイトで見つけましたが、非常にうまく機能しているようです。
- .git ディレクトリを Web サーバーにコピーします。
ローカル コピーで、.git/config ファイルを変更し、Web サーバーをリモートとして追加します。
[remote "production"] url = username@webserver:/path/to/htdocs/.git
サーバーで、 .git/hooks/post-update をこのファイルに置き換えます(以下の回答で)
ファイルへの実行アクセスを追加します (サーバー上で):
chmod +x .git/hooks/post-update
ここで、Web サーバーにローカルにプッシュするだけで、作業コピーが自動的に更新されます。
git push production
以下の更新後のファイルを使用します。
- .git ディレクトリを Web サーバーにコピーします。
ローカル コピーで、.git/config ファイルを変更し、Web サーバーをリモートとして追加します。
[remote "production"] url = username@webserver:/path/to/htdocs/.git
サーバーで、.git/hooks/post-update を以下のファイルに置き換えます。
ファイルへの実行アクセスを追加します (サーバー上で):
chmod +x .git/hooks/post-update
ここで、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
失敗と行き詰まりを何度も経験した後、この記事のおかげで、ようやく "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 のバグです)
サーバーに git をインストールしたり、そこに .git フォルダーをコピーしたりしないでください。git クローンからサーバーを更新するには、次のコマンドを使用できます。
git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project
プロジェクトから削除されたファイルを削除する必要がある場合があります。
これにより、チェックインされたすべてのファイルがコピーされます。とにかく、rsyncはサーバーにインストールされているsshを使用します。
サーバーにインストールするソフトウェアが少ないほど、サーバーはより安全になり、構成の管理と文書化が容易になります。サーバー上に完全な git クローンを保持する必要もありません。すべてを適切に保護することがより複雑になるだけです。
本質的に、あなたがする必要があるのは次のことだけです:
server = $1
branch = $2
git push $server $branch
ssh <username>@$server "cd /path/to/www; git pull"
これらの行は、アプリケーションに という実行可能ファイルとして含まれていますdeploy
。
したがって、デプロイを実行したいときは、 と入力し./deploy myserver mybranch
ます。
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 フックと合わせて究極のソリューションです。
私が行う方法は、変更をプッシュする展開サーバーに裸の Git リポジトリを用意することです。次に、デプロイメント サーバーにログインし、実際の Web サーバーの docs ディレクトリに移動して、git pull を実行します。これを自動的に行うためにフックを使用していません。
更新: 現在、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 とは異なります)
展開シナリオの場合
このシナリオでは、コードを github/bitbucket に保存しており、ライブ サーバーにデプロイしたいと考えています。この場合、次の組み合わせが機能します(これは、ここで非常に支持された回答のリミックスです):
.git
ディレクトリを Web サーバーにコピーします- ローカル コピー
git remote add live ssh://user@host:port/folder
- リモートで:
git config receive.denyCurrentBranch ignore
リモートで:
nano .git/hooks/post-receive
次のコンテンツを追加します。#!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f
リモートで:
chmod +x .git/hooks/post-receive
- 今、あなたはそこにプッシュすることができます
git push live
ノート
- このソリューションは、古いバージョンの git で動作します (1.7 および 1.9 でテスト済み)。
- 最初に github/bitbucket に確実にプッシュする必要があるため、ライブで一貫したレポが得られます
.git
フォルダーがドキュメント ルート内にある場合は、.htaccess
( source )に追加して外部から非表示にします。RedirectMatch 404 /\..*$
デプロイの管理にはcapistranoを使用します。カピストラーノをビルドしてステージング サーバーにデプロイし、すべてのサーバーで rsync を実行します。
cap deploy
cap deploy:start_rsync (when the staging is ok)
capistrano を使用すると、バグが発生した場合に簡単にロールバックできます
cap deploy:rollback
cap deploy:start_rsync
Giddyupは、言語に依存しない、水を追加するだけのgit フックで、git push を介して展開を自動化します。また、Web サーバーの再起動、キャッシュのウォームアップなどのためのカスタムの開始/停止フックを使用することもできます。
https://github.com/mpalmer/giddyup
例をご覧ください。
おそらく、「安定した」ブランチを言うためにコミットが行われると、変更をプルしてPHPサイトに適用するgitフックを設定することができます。大きな欠点は、何か問題が発生した場合に制御できなくなり、テストに時間がかかることです。ただし、トランクブランチを安定したブランチにマージすると、どのくらいの作業が必要になるかを知ることができます。遭遇する可能性のある競合の数。1つのサイトのみを実行する場合を除いて、サイト固有のファイル(構成ファイルなど)を監視することが重要です。
または、代わりにサイトに変更をプッシュすることを検討しましたか?
gitフックの詳細については、githooksのドキュメントを参照してください。
私は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
サーバー上に 2 つのコピーが必要なようです。プッシュ/プルできるベア コピー。完了したら変更をプッシュします。次に、これを Web ディレクトリに複製し、cronjob を設定して Web ディレクトリから毎日 git pull を更新するか、それで。
最終的に、リポジトリから新しい更新を自動的にプルダウンする独自の基本的なデプロイツールを作成しました-https ://github.com/jesalg/SlimJim-基本的に、github post-receive-hookをリッスンし、プロキシを使用してトリガーしますスクリプトを更新します。
複数の開発者が同じリポジトリにアクセスする環境では、次のガイドラインが役立つ場合があります。
すべての開発者が属する UNIX グループがあることを確認し、.git リポジトリの所有権をそのグループに付与します。
サーバー リポジトリの .git/config で、sharedrepository = true を設定します。(これは、コミットとデプロイに必要な複数のユーザーを許可するように git に指示します。
bashrc ファイル内の各ユーザーの umask を同じに設定します - 002 が良いスタートです