Wordpressインストールで、ローカルバージョン、ステージングバージョン、本番バージョンがあります。ローカルで変更を加えてプッシュするだけで、「シンプルな」gitワークフローを設定しようとしています。ローカルからステージングへ、ローカルから本番へ。最初はこれは簡単な作業だと思いました。リポジトリを初期化し、2つのリモート「ステージング」と「本番」を追加し、リモートでgitを初期化し、変更をプッシュすることができました。ローカルバージョンからステージングサーバーおよび本番サーバーに、通常は次のコマンドを使用します。
git add .
git commit -m "some changes"
git Push staging master
git Push production master
ただし、作業中のある時点で何かが変更され、ステージングにプッシュすることはできますが、エラーが発生せずに本番サーバーにプッシュすることはできません。
! [remote rejected] master -> master (Working directory has unstaged changes)
「gitstatus」を実行すると、次のように表示されます。
On branch master
nothing to commit, working tree clean
Stack Overflowに関するいくつかのSIMILAR BUT DIFFERENTの質問に対する回答を読んだ後、私は次のことを試しました。
git pull staging master
git pull staging master --rebase
git pull production master
git pull production master --rebase
また、リモートサーバーでこのコマンドを実行してみました
git config --local receive.denyCurrentBranch updateInstead
Gitを最初から完全に再インストールするために、サーバーとリポジトリを数回完全に再作成しましたが、この問題はしばらく経っても発生し続け、この時点でGitはワークフローを支援するのではなく実際に傷つけています。誰かが私の間違いが何であるかについて何か洞察を持っているなら、それは大いにありがたいです!
同様の問題が発生し、作業コピーファイルをすぐにチェックアウトしたい非ベアリモートリポジトリにプッシュしました。
私のリモートはreceive.denyCurrentBranch updateInstead
で構成されていましたが、それでも予測できない時間にプッシュを受け入れることを拒否しました。
Git 2.4は Push-to-checkout フックを追加しました。これは、このようなプッシュの失敗をオーバーライドできます。
githooksドキュメント の例に基づいて短いスクリプトを作成しました。
#!/bin/sh
set -ex
git read-tree --reset -u HEAD "$1"
このスクリプトをリモートリポジトリの.git/hooks/Push-to-checkout
にインストールしました。
このスクリプトは、リモートの作業コピーを上書きすることに注意してください。これらのファイルへの変更をマージしようとはしません。
これは、作業コピーに単にリポジトリ内のファイルを反映させたいためです。
Gitベアリポジトリを作成することは、プッシュするためのベストプラクティスです。
ベア以外のファイルにプッシュできます...ただし、ソース側からファイルをプッシュしているときに、宛先側でファイルを変更していない場合に限ります。 Push-to-deploy を参照してください。
ただし、ベストプラクティスは、受信したすべてのファイルを実際のフォルダーにチェックアウトするために、受信後のフック( 他の回答のように )を追加することです。