post-updateフックを使用して別のリポジトリで「git pull」を実行すると、「致命的:gitリポジトリではありません:「。」」が取得されます


89

私はgitを初めて使用するので、ここで用語を誤用した場合は謝罪し(訂正してください)、最善を尽くします。

裸のgitリポジトリ(ハブ)と開発サイトの作業用コピー(プライム)をWebサーバーにセットアップしようとしています。私はこの記事の後でそれをパターン化しようとしました。ハブリポジトリがプッシュされるたびに開発作業コピーを更新してほしい。私はこのための適切なフックがであるという印象を受けていますpost-update

#!/bin/sh
whoami
cd /path/to/working-copy/
RET=`git pull`
echo $RET

更新

ローカルリポジトリからベアハブに変更をプッシュすると、更新後のスクリプトから次の出力が得られます。

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

ただし、ユーザー「sites」としてサーバーにSSH接続し、このスクリプトを手動で実行すると、うまく機能します。このフックまたはスクリプトで何が問題になっているのかに関するアイデアはありますか?

回答:


179

これが最終的に機能したスクリプトです。元々欠けていたリモートでの動作を妨げていたのは、unset GIT_DIR

#!/bin/sh
cd /path/to/working-copy/ || exit
unset GIT_DIR
git pull repo branch

exec git-update-server-info

18
確認できます。設定を解除GIT_DIRすると問題が解決します。
jmtd

16
理由を理解してくれる人のために:gitがのGIT_DIR代わりに変数を使用するためですPWDcd-ing PWDGIT_DIR。を変更しません。最初のものが使用できない場合、gitからGIT_DIRtoへのフォールバックが必要PWDです。
zupa 2013年

問題は、フックスクリプトに対してこれを実行する必要があることをgitが確認する必要がある理由です(GIT_DIRを設定して、スクリプトでも他の場所に 'cd'が存在するように 'git what'が引き続き機能するようにします)。私は個人的にはgitがこの種の魔法を実行しないことを選択します。
Steven Haryanto 2013

2
この背後にある理由は、Gitがいくつかの環境変数すべてのコアgitコマンドに適用しているためです
Casey

後にマージ競合が発生するとどうなりgit pullますか?
lolololol ol 2018


0

それが設定されていないにもかかわらず、GIT_DIRは機能します。

この問題は、GIT_DIRを誤って別の場所に設定した場合に発生します。

あなたは代わりにそれを追加することができます:GIT_DIR = .git /それは動作します


0

私の場合、作業ツリーを指定しており、これはpull(またはより正確には)fetch)の。

作業ツリーがgit configにある場合、設定を解除するには、次のようにします。

git config --unset core.worktree

(作業ツリーを設定する他の方法があります)

注意することが重要です、

まず、カスタムワークツリーを使用して自分の周りにこの穴を掘り起こさない限り、これは問題になりません。

バンター:

これは、git内部ではワークツリーに関連するパスを使用することを意味します.git/。私の経験では、gitの最も基本的な部分を除いて、ワークツリーは十分にサポートされていません。私は十分に実験していませんが、Gitディレクトリの設定変数が適切に設定されていれば、Gitはおそらく動作します。


-1

おそらく権限の問題があります。裸のgitリポジトリをどのように設定したかはわかりませんが、それがgitユーザーの下で実行されているgit場合は、ユーザーが実行できることを確認してくださいgit pullプロジェクトディレクトリでてください。

必要に応じてこれを試して、フックが実行されているときに自分がどのユーザーであるかを確認します。

echo `whoami`

サーバーにgitユーザーとしてsshを実行すると、プロジェクトディレクトリでgit pullを使用して問題なく実行できます。それは、スクリプトを実行する必要があるユーザーと思います。whoami行をスクリプトに追加してみることができますが、フックとして実行した場合、そのスクリプトからの出力はどこに行きますか?たぶん、その出力をエコーする代わりにログファイルに送信する必要がありますか?
Ty W

echo `whoami`それwhoamiは何をしませんか?
ChristofferHammarström、

フックスクリプトからstdoutへの出力は、アクションを実行しているリモートに表示されます。または、言い換えると、「git push」と言うと、リモートのフックからの出力がstdoutに表示されます。
ebneter

ええ、私がもので遊んでいたときに気づいた。非常に便利です:)
Ty W
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.