bugfix> git > 投稿

私はGITが初めてです。 コマンドでリポジトリを作成します:

cd /home/user_name
mkdir repo && cd repo
mkdir site.git && cd site.git
git init --bare

その後、 hooks でディレクトリ、 post-receive を作成しますファイルしてそこに追加します:

#!/bin/sh
git --work-tree=/home/user_name/dev.ireserve.com --git-dir=/home/user_name/repo/site.git checkout -f

その後、権限を追加します: chmod +x post-receive

私が実行するlaravelプロジェクトディレクトリのローカルマシンで:

git init

次に実行します:

git remote add live ssh://root@example.com/home/user_name/repo/site.git

その後通常:

git add .
git commit -m "my message"

そして最後に:

git push live master

しかし、私はメッセージを受け取りました:

remote: fatal: This operation must be run in a work tree

なぜこのエラーが発生したのですか?問題は何ですか?

回答 1 件
  • TL;DR: mkdir だと思う  Laravelのセットアップ手順にステップがありません。


    このコマンド:

    git init --bare
    
    

    作るためのものですサーバ リポジトリ誰も仕事をしません

    今、それは奇妙なことのように思えるかもしれません:なぜ誰もリポジトリで作業できないリポジトリを作成するのですか?そしてそれ 奇妙なことですが、理由があります。

    裸リポジトリと非裸リポジトリ

    リポジトリを作成する場所できる 作業:

    git init
    
    

    その後、あなたはそれで働くことができますが、少しだけ単純化するために、他の誰もすべきではありません今まで ただ送る あなたの仕事は予告なしに。しかし、人々もする必要があります共有 一般的な使用パターンの1つは、企業の「マスターソースリポジトリ」マシンなどの中央サーバー上の作業共有リポジトリを、誰もが作業を送信する場所とすることに全員が同意することです。

    しかし同時に、人々の仕事をその中央のリポジトリに持ち込むのに一日中費やしている人がいることは望ましくありません。準備ができ次第、他の人が中央リポジトリにアクセスできるように、すぐに作業を送信できるようにする必要があります。見る (または入手して使用する)彼らの作品直ちに。だから、あなたはpeoleする場所が必要ですできる 発表せずに彼らの作品を送り、たった今

    それは --bare です  リポジトリ。誰も働いていないので、上書きしません彼らの を送信することにより、進行中の作業完成した 作業。

    これは本当にコミット とワークツリー

    新しいコミットを作成すると、永続的で破損しないようになります1 作業のスナップショット。しかし、どこかからこれを取得する必要があります。最小の「どこか」は、他のバージョン管理システムにありますワークツリー: 仕事をする場所。 Gitは追加のしわをここに挿入し、それについてユーザーに強制します。インデックス、とも呼ばれるステージングエリア または時々キャッシュ (1つのことに対して3つの名前。これはGitで非常に重要なエンティティです!)。ただし、インデックスとワークツリーはペアになっています。これらは、物を書くことができる場所です。コミットは、一度行われると、完全に変更不可能であり、これが破損の原因となります。だから、あなたは両方を読むことができる仕事をする場所が必要ですそして書く ファイル。

    ベアリポジトリはコミット(読み取り専用のスナップショット)を保持しますが、ワークツリーはありません。2  それだけです。作業ツリーがなければ、作業する場所はありません。それがプッシュに適している理由ですが、仕事をする場所がなければ、仕事をすることはできません。同様に、非ベアリポジトリも必要です。


    1コミットは本当に主に 恒久的:それらを見つけることができる名前がある限り、それらは続きます。この詳細は、他のチュートリアルで使用します。ただし、コミットの本当の名前はハッシュIDであるため、完全に破損することはありません。ハッシュIDは、事前にはまったく予測できませんが、暗号化されたチェックサムです。内容 コミットの。何かがうまくいかず、コミットが破損した場合、Gitはその内容が本当の名前のハッシュIDに適合しなくなるので気づきます。

    2ややばかげた実装上の理由で、裸のリポジトリにはまだインデックスがあります。ワークツリーがありません。それらはペアになっています-インデックスインデックス(名前の由来)ワークツリーですが、通常、ベアリポジトリにはまだ完全に空のインデックスがあります。


    一部のサーバーは、ベアリポジトリのワークツリーを偽造します

    ベアリポジトリ(ワークツリーなし)とGitのリポジトリを組み合わせることができますフック 一種の偽のワークツリーを作成するメカニズム。これは、たとえば、Laravelセットアップの動作方法です。ベアサーバーが git push を受信したとき 、サーバーはフックを実行し、フックは git --work-tree=<path> checkout -f を実行します   <path> で一時的な作業ツリーを設定するには 。この一時的な作業ツリーは、1つの git checkout の間の作業ツリーです。  コマンド。 (インデックスは、その一時的なワークツリーにインデックスを付けるようになりました。)次に、 git checkout  終了し、ベアリポジトリにはワークツリーがありません。まだできない作業 初期化。

    この最後の git --work-tree=<path> checkout -f  しません作成する ディレクトリ <path> 。このディレクトリはすでに存在している必要があります。最初は空である必要があります。最初の git checkout -f の後 、それは何 git checkout が含まれます  書きました;後の各 git checkout -f 、Gitは(インデックス経由で)何でも含まれていると仮定します最終  git checkout -f  書いて、この情報に基づいて適切に更新します。

    したがって、元のLaravelセットアップには mkdir home/user_name/dev.ireserve.com が必要でした  初期化。

    GIT add

あなたの答え