私は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
なぜこのエラーが発生したのですか?問題は何ですか?
関連した質問
- リポジトリの一部を自分のリポジトリにマージする
- ログインせずに別のusernameとuseremailでリモートにプッシュできるのはなぜですか?
- マスターブランチから機能ブランチにコミットを自動的にマージするgitオプションはありますか?
- Gitリモート追跡ブランチの名前を指定して、どのローカルブランチがそれを追跡するかを見つける方法は?
- 安全に履歴をチェックする方法は?
- 遡及的にいくつかのタグを追加しましたが、git logABはコミットを示していません
- git log--間違ったコミットを含めてフォローする
- ローカルgitリポジトリのネスト構造を確認する方法
- Gitはすでに最新のエラーです
- 新しいメジャーアップデート用に個別のリポジトリを作成しますか?
TL;DR:
mkdir
だと思う Laravelのセットアップ手順にステップがありません。このコマンド:
作るためのものですサーバ リポジトリ誰も仕事をしません。
今、それは奇妙なことのように思えるかもしれません:なぜ誰もリポジトリで作業できないリポジトリを作成するのですか?そしてそれは 奇妙なことですが、理由があります。
裸リポジトリと非裸リポジトリリポジトリを作成する場所できる 作業:
その後、あなたはそれで働くことができますが、少しだけ単純化するために、他の誰もすべきではありません今まで ただ送る あなたの仕事は予告なしに。しかし、人々もする必要があります共有 一般的な使用パターンの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