裸でないリポジトリへのプッシュ操作を安全にすることに関して、そこにいる git の専門家からのガイダンスを使用できます。基本的に、私はこれを行う方法について計画を立てており、計画が正気かどうかについてアドバイスを使用できます:)
通常、git で裸でないリポジトリにプッシュすると、その作業コピーとインデックスは更新されません。私が発見したように、後で手動で更新するのを忘れると、深刻な問題が発生する可能性があります!
私たちのグループには、人々がクローンを作成してプッシュバックする「中央」リポジトリがいくつかありますが、多くの人々は、クローンのクローンを作成し、必要に応じてそれらの間で真の分散方式でプッシュ/プルできるようにしたいと考えています。これを安全にするために、「clone」または「init」を介して作成されたすべてのリポジトリに、プッシュ操作の後に作業ディレクトリとインデックスを更新して同期する post-receive フックが自動的にインストールされるようにしたいと思います。新しい頭。
これは、hooks サブディレクトリに post-receive フックを含むテンプレート ディレクトリを作成し、グループの全員に次のことをさせることで実現できることがわかりました。
git config --global init.templatedir /path/to/template/dir
現在、受信後のフックは次のようになっています。
export GIT_WORK_TREE=..
git checkout -f HEAD
これは期待どおりに動作するように見えますが、チェックアウト コマンドについては不明な点があります。作業ディレクトリとインデックスを HEAD の状態と同期する目的で、「git checkout -f HEAD」と「git reset --hard HEAD」は同等ですか?
「git reset --hard HEAD」が自分のやりたいことを実行することはわかっていますが、受信後のフックで使用すると、テストでプッシュ操作が大幅に遅くなるため、質問します (すべてのファイルの新しいチェックアウトを行うようです。ファイルが作業ディレクトリでダーティかクリーンかに関係なく)。「git checkout -f HEAD」は、同じことをはるかに高速に実行するように見えます(クリーンな作業ディレクトリとHEADと同期したインデックスを取得します)が、チェックアウトコマンドがオンザフライで実行される傾向があることを考えると、少し緊張していますコミットされていない作業ディレクトリの変更とマージします。このコマンドは、すべての場合 (ファイルの削除、名前の変更などを含む) で HEAD の状態と正確に一致する作業ディレクトリとインデックスを本当に提供してくれますか?
アドバイスをよろしくお願いします!