19

サーバーに非ベアリポジトリ(dirs /home/andrew/webおよび/home/andrew/web/.git)があり、receive.denyCurrentBranchを無視して受信後フックを作成するように設定します。

#!/bin/sh
GIT_WORK_TREE=/home/andrew/web git checkout -f

sh .git / hooks / post-receiveを実行すると、すべてが正常に機能します。しかし、PCからプッシュすると、次のエラーが発生します。

remote: fatal: Not a git repository: '.'

この問題を解決する方法はありますか?そして最終的には、ベアリポジトリを切り替える必要はありませんか?

ありがとうございました

編集:これが私の新しい受信後フックです。なぜこのようなのかは、受け入れられた回答に記載されています。

echo "\nChecking out $PWD"
GIT_DIR=/home/andrew/web/.git
GIT_WORK_TREE=/home/andrew/web git checkout -f
4

1 に答える 1

30

[編集、2017年2月:この古い答えはまだ少しヒットしているので、いくつかのメモを追加しましょう。(1)この種のライブ更新は、多くの場合、悪い考えです。なぜそれを実行しているのかを理解し、自分の作業を台無しにしないようにしてください。(2)2.3以降のGitでは、に設定できるようreceive.denyCurrentBranchになりました。さらに、Git2.4以降updateInsteadではフックを微調整できます。詳細についてはgit configドキュメントを参照してください。]

ポストレシーブフックは、に$GIT_DIR設定して実行され.ます。これにより、gitは、などではなく、などを検索します。ただし./HEAD、フックを変更するために何もしないため(とにかく示されているように)、フックはサブディレクトリ()で実行されます。この失敗は非常に不思議です。実際には、有効なgitリポジトリになります。./refs/heads/master.git/HEAD.git/refs/heads/master$PWD.git/home/andrew/web/.git.

パス名のハードコーディングを回避する標準的なトリックの1つは、cd ..; git checkout -f受信後のフックとして使用することです。これは、の設定が$GIT_DIR問題になる場所です。cd ..フックが実行された後(この場合も想定)/home/andrew/web、もちろんその時点では、ではなく$GIT_DIRする必要があるためです。そのための標準的な修正は、単に設定を解除することです(に設定しても機能します)。.git.GIT_DIR.git

ただし、示されている受信後のフックは、(適切なハードコードされたパスの変更を使用して)正常に機能します。次に、PCではなくUnixライクなマシンからプッシュします。サブディレクトリからディレクトリを変更する何か他のことが起こっている可能性はあり.gitますか?echo running in $PWDあなたはあなたがどこにいるかを見るためにフックのような何かをすることができます。

于 2012-05-09T09:49:36.420 に答える