12

中央リポジトリでgitを使用しています(Gitosisを使用)。変更が中央リポジトリにプッシュされるたびに開発メーリングリストに電子メールを生成し、gitリポジトリのドキュメントフォルダーからドキュメントを生成するための受信後フックを作成しました。

したがって、〜git /にはディレクトリがあり、gitリポジトリのクローンを含む「a」と呼びます。受信後のフックは次のようになります。

#!/bin/bash
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )

電子メールスクリプトは機能していますが、ドキュメントの生成は機能していません。pull_log.logの内容は次のとおりです。

fatal: Not a git repository: '.'

これは、上記のスクリプトの5行目の正しいディレクトリに変更されていないと思います。私が間違っている?どうすればこれを機能させることができますか?

編集:応答で提案されているように、受信後のフックを更新しました。スクリプトは次のようになります。

#!/bin/bash
function die {
  echo "$*" >&2; exit 1
}

function checkgit {
  [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}


cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( set -x
checkgit ~git/a
cd ~git/a
checkgit .
pwd
git pull
php ~git/a/scripts/generate_markdown_documentation.php )

そして、gitpushから次の出力が得られます。

+ checkgit /var/git/a
+ '[' -d /var/git/a/.git ']'
+ cd /var/git/a
+ checkgit .
+ '[' -d ./.git ']'
+ pwd
/var/git/a
+ git pull
fatal: Not a git repository: '.'
+ php /var/git/a/scripts/generate_markdown_documentation.php

これ以上の助けはありますか?

ああ、スクリプトを自分で実行すると、機能します(hooks / post-receiveと言って実行します)

serverfaultのおかげで、問題を発見しました。基本的に、環境変数はフックの実行時GIT_DIRGIT_WORK_TREE設定され、これらはgitpullに悪影響を及ぼします。変数を設定解除すると、問題が修正されます。

4

3 に答える 3

3

より多くの診断が必要です。

function die {
  echo "$*" >&2; exit 1
}

function checkgit {
  [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}

この時点で、括弧の直後のサブシェルで、次のようなものを試すことができます

set -x # show exactly what's executed (writes to stderr)
checkgit ~git/a
cd ~git/a && checkgit . && git pull ...

サブシェルのstderr全体をリダイレクトすることも検討してください。

( ... ) 2>/tmp/mydiagnosis$$.log

(これは一時的な措置であり、ログに機密情報がない場合にのみ問題ありません。)


OK Silas、あなたの追加情報は多くの厄介な可能性を除外します。私は私のgitfuの終わりに近づいています、しかしここに試すべきいくつかの事柄があります:

  1. 入って、手~git/aで作ることができるかどうか見てくださいgit pull。これは失敗するはずです。
  2. 入っ~git/aて実行しますgit status。これも失敗するはずです。そうでない場合はgit、非常に悪いエラーメッセージが表示されます。

両方の手順が失敗した場合~git/aは、思っていたクローンではありません。名前を変更し、新しいクローンを作成して、問題が解決するかどうかを確認します。

最初のステップが手作業で成功した場合、何か奇妙なことが起こっており、私は困惑しています。

最初のステップが失敗しても2番目のステップが成功した場合は、ブランチに問題がある可能性があります。

  • おそらく、リポジトリ~git/aが間違ったブランチに設定されていて、リポジトリにないブランチが必要です。git branch -a予期しないものが表示されるかどうか試してみてください。

  • おそらくあなたはブランチを持っていますが、それはリモートリポジトリに適切に関連付けられていません。この時点で、あなたはに飛び込む必要があります~git/a/.git/config、そして私はあなたがそこで見つけることを期待すべきことを説明する方法を本当に知りません。その時点で、実際のgitエキスパートが必要になります。テレビで再生するだけです。

于 2010-02-23T02:00:50.977 に答える
0

最近、同様の問題が発生しました。これは、gitが設定する環境変数、特に$GIT_DIR変数に関連していると思います。その設定がある場合、他のリポジトリのすべてのgitコマンドが奇妙に動作し始めます。基本的に、フック内でgit pullを実行するには、これらの奇妙な変数がなく、gitの混乱を招くニュートラルシェル環境で呼び出す必要があると思いますが、その方法はまだわかりません。

于 2011-10-19T09:31:14.507 に答える
0

unset GIT_DIRあなたが見ている致命的なエラーのために働く解決策です。

これは、フック内のすべてのスクリプトに適用され(更新後は別の一般的なスクリプトです)、その中でgitコマンドを使用します。gitコマンドは、pwdの代わりにenvのGIT_DIRを使用します。

詳細については、 https://stackoverflow.com/a/4100577を参照してください。

于 2014-10-03T15:10:04.420 に答える