2012-05-08 24 views
19

私のサーバ(dirs/home/andrew/webと/home/andrew/web/git)には裸のリポジトリがあります。ポスト受けるフックを無視し、作成するために、設定されたreceive.denyCurrentBranch:ポスト受信フックのGitチェックアウト: "gitリポジトリではありません。" "

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

私はSHの.git /フックを実行すると/ポスト受け取るには、すべてが正常に動作します。私は私のPCからプッシュするときしかし、私はこのエラーを取得する:

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

は、どのように私はこの問題を解決することができる方法はありますか?そして、最終的に裸のレポを切り替える必要はありませんか?

はあなたに

EDITありがとう:ここでは私の新しいポスト受け取るフックです。なぜこれが受け入れられた答えに記述されているのか?

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

プッシュにはどのコマンドを使用しますか?特に、リモートURLは何ですか? – Simon

+0

@Simon私は "git push origin"を使用し、私のリモートURLは "[email protected]:web"です。 – A123321

+0

あなたは完全なパス '[email protected]:/ home/andrew/web'を試すことができますが、実際の問題はあなたのリモートリポジトリが裸ではないということです。あなたはプッシュを強制しようとすることができます: 'git push -f origin' – Simon

答えて

25

[編集、2017年2月:この古い答えはまだ少しのヒットを取得します、それでは、いくつかの注意事項を追加してみましょう。 (1)この種のライブアップデートはしばしば悪い考えです。なぜあなたがそれをやっているのかを知っていて、自分の仕事を壊さないようにしてください。 (2)2.3以降のGitでは、receive.denyCurrentBranchupdateInsteadに設定し、Git 2.4以降でフックを調整することができます。詳細は、the git config documentationを参照してください。

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

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

あなたのポスト受信フックは適切なハードコーディングされたパスの変更で、私にとってうまくいきます。それでは、私は、PCではなく、Unixのようなマシンを使うようにしています。 .gitサブディレクトリからディレクトリが変更される可能性はありますか?フックにecho running in $PWDのようなことをして、あなたがどこにいるかを見ることができます。

+1

感謝します!私はこれで年を過ごしたが、誰も説明できなかった。 – A123321

+2

'$ GIT_DIR'を' .git'に設定し、ディレクトリを 'cd 'して私のために働いていました。ありがとう! – bkconrad

+3

私のポスト受信で 'unset GIT_DIR'が私のために働いていました。 –

関連する問題