これが重複としてマークされる前に、グーグルで1日試してみた後もまだ始めたところにいることを明確にしたいので、この質問は、他の同様の質問から期待される結果が得られない理由をデバッグする方法に関するものです。
私のレポには「開発」ブランチがあり、テストのためにこのブランチをプッシュできるステージング サーバーを設定しようとしています。ライブ サーバーは、マスター ブランチを Web ルートにチェックアウトするためのベア リポジトリと post-receive フックを使用して既にセットアップされています。うまく機能するので、ステージングサーバーを同じ方法でセットアップすることから始めました。私の問題は、ステージング サーバーの Web ルートが常にマスター ブランチを取得することです。
私が読んだことに基づいて、これは私にとってうまくいくはずの解決策です:
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f
私のローカルレポの構成には、リモート用にこれがあります
[remote "staging"]
url = path/to.git
push = +develop:master
アイデアはgit push staging
、ローカルの開発ブランチを実行すると、リモートのマスター ブランチにプッシュされ、そのマスター ブランチが Web ルートにチェックアウトされるということです。
私が試した他のこと:
該当する場合は、先頭に +s フラグと -f フラグを付けて、または付けずに試しました。
リモート リポジトリが問題だった場合は、リモート リポジトリと Web ルートを削除し、実行git init --bare
して最初からやり直しました
ローカル構成にプッシュ行がないため、開発ブランチをチェックアウトするようにフックを変更しました
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f develop
git push staging develop
ローカルで実行するだけでなく、
リモートに SSH で接続しGIT_WORK_TREE=/path/to/web/root git checkout -f develop
、裸のリポジトリから実行しました。これにより が発生しましたSwitched to branch 'develop'
が、Web ルート内のファイルにはまだマスターが反映されています。
この時点で、私はいくつかの細部を見逃しているか、気が狂っています. 多くの人がこのようにワークフローをセットアップしていると思います。
アップデート
@VonCs コメントごとに、ブランチ名をフックに追加し、リモート ローカル構成を に設定しましたpush = +refs/heads/develop:refs/heads/develop
。プッシュすると、ローカルの開発ブランチがリモートの開発ブランチに移動し、でハッシュをチェックした後git log
、プッシュが機能していることがわかります。ただし、次に実行するgit status
と、リターンは次のようになります。
# On branch develop
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: a/file/I/modified/locally
そのため、フックが正しく実行されていません。hooks/post-receive ファイルの内容を SSH 経由で実行すると、正しくチェックアウトされ、ステージング サイトは問題なく動作します。では、フックが実行されない理由と、それが同じ問題に関連しているかどうかを判断するにはどうすればよいでしょうか?
明確にするために、私のフックは現在次のようになっています。
#! /bin/sh
GIT_WORK_TREE=/path/to/web/root git checkout -f develop