2

「[リモート拒否] マスター ブランチは現在チェックアウトされています」というエラーが表示されます - 基本的に、この投稿の OP と同じ問題です ( Git プッシュ エラー '[リモート拒否] マスター -> マスター (ブランチは現在チェックアウトされています)' ) 、そして以下はそれを修正するために私がこれまでに行ったことですが、今では、上記の問題または新しい問題 - 「ワークツリーがありません」エラーのどちらかを選択できるようです。以下で説明するように、これは私が現在立ち往生しているところ。

また、他の質問とは異なる要件があることにも注意してください。ローカルマシンがコードをプル/プッシュする単一のリポジトリ(オリジン/リモート)だけで、ライブWebサーバーです。他の投稿では、これらの行に沿った要件は指定されていませんでしたが (このオプションはそこで扱われていませんでした)、私のニーズは非常に具体的であるため、この質問です。

また、ローカル ワークステーションからサーバー (リモート) にプッシュされるのではなく、サーバー上のこのディレクトリのファイルを (まだ Git を使用しているにもかかわらず) 直接編集する場合があることも避けられないことに注意してください。

最初にリポジトリをリセットし、ベアに設定します (最初にサーバーに Git をセットアップした開発者はgit init、リポジトリをセットアップするときにのみコマンドを使用しました)。

    git init --bare    

次に、すべてのサーバー ファイルが既に存在していた (空のディレクトリではない) ため、次の方法 (通常) で最初のコミットを行いました。

    git add .
    git commit -m "initial commit"

.git/config次に、ファイルを次のように編集しました。

    git config receive.denyCurrentBranch ignore    

私の現在のサーバー.git/configファイルは次のようになります。

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true

[receive]
        denyCurrentBranch = false

コミットを正常にプッシュできますが、これを適用しようとすると:

    git checkout -f

上で提案したように (おそらくすべてのコミットを受け入れ、HEAD をリセットしてすべての変更を含めるには?)、次の致命的なエラーが発生します。

    fatal: This operation must be run in a work tree

ワークツリーをこのディレクトリに設定する必要がありますか? もしそうなら、どうすればいいですか?そして、私がそれを行った場合、結果は依然として私の述べた目標に沿っています(繰り返しますが、個別のベアリポジトリと非ベアリポジトリはありません-ライブWebサイトにもサービスを提供し、Webルートにある単一のディレクトリのみです) ?

私が行方不明になっていることを他に何かする必要がありますか?

私はこのトピックに関するstackoverflowを広く読ん ます .特にこちら: http://git-scm.com/book/ch2-2.html ) Git-Flow (nvie): http://nvie.com/posts/a-successful-git-branching-model/

すべてのヘルプとコメントは大歓迎です。ありがとうございました!

4

1 に答える 1

3

裸の git リポジトリを作成しました (それ自体には作業ツリーはありません)。ベア git リポジトリは、変更をプッシュする場合に推奨される方法です。

そして、あなたの質問から、ある種のサーバー設定があり、 を実行するgit pushたびに、サーバー上のファイルを更新して、新しくプッシュされた変更を反映させたいと考えています。

はい、実行可能ですが、裸のレポとワークツリーを分離する必要があります。作業ツリーの場所は、サーバー上でファイルを展開する必要がある場所に対応している必要があります。だと仮定しましょう/foor/bar。post-receive フックを設定することで、プッシュのたびに自動的に新しいファイルをこのワークツリーの場所にデプロイできます。

このセットアップの手順は次のとおりです。

  1. 作業ツリー ディレクトリが存在しない場合は作成します。

    mkdir -p /foo/bar
    
  2. 次のスクリプトを作成し、bare-repo としてコピーします。hooks/post-receive

    #! /bin/sh
    GIT_WORK_TREE=/foo/bar git checkout -f
    
  3. このスクリプトを実行可能としてマークします。

    chmod +x hooks/post-receive
    

必要なのはそれだけです。を試すgit pushと、新しい変更が自動的に/foo/bar場所に展開されます。

注意: git checkout -fは、追跡されたファイルのすべてのローカル変更を上書きし、そのような変更は/foo/bar新しい で失われcheckout -fます。git で追跡されていないが、 で作成/生成されたファイルは/foo/bar影響を受けません。

また、 で行った変更を削除することをお勧めします。.git/config特にreceive.denyCurrentBranch.

設定は次の IMO のようになります。

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
    logallrefupdates = true
于 2013-03-27T19:17:29.937 に答える