gitフックでは、現在の作業ディレクトリがgitリポジトリ内にあることが保証されていますか?


81

実験的には、現在のディレクトリをリポジトリのルートに設定してgitフックが実行されるようです。ただし、gitのドキュメントではそれについての保証はありません。gitリポジトリを見つけるために現在の作業ディレクトリに依存する必要がありますか、それともフックに関連付けられたgitリポジトリを解決するためのより良い方法がありますか?


4
それがどれだけ関連しているかわからない。Git 2.7.3(-r1)を備えたGentoo安定ボックスでは、gitフックが実行されるだけで.gitなく、git reset --hard実際にはディレクトリ内に作業ディレクトリ構造が作成されます。.gitこれは、私の意見ではまったく間違っています。
パベルŠimerda

回答:


45

これは、環境変数に設定された値に基づいていますGIT_DIR。フックの実行が開始されると、リポジトリのルートに設定されます。多くのフック、特に別のリポジトリからプルを実行するフックは、必要に応じてこの環境変数を設定解除(およびリセット)します。


6
$ GIT_DIRの末尾にスラッシュはありますか?
PuercoPop 2012

8
これは正解ではありません。GIT_DIRは常にリポジトリのルートに設定されているわけではありません。このブログを参照してください。
ghopper21 2015

2
@ Ghopper21その記事も完全には正しくありません。コミット後のフックの場合、現在のディレクトリが作業ツリーの最上位であることが示されています。ただし、私の非常に単純なコミット後のスクリプトでは、作業ツリーの最上位に他のスクリプトが見つかりませんでした。例:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Vince

70

現在の回答は古くなっているようです。2.9.0の時点で、ドキュメントには次のように記載されています。

Gitがフックを呼び出す前に、Gitはその作業ディレクトリを非ベアリポジトリの作業ツリーのルート、またはベアリポジトリの$ GIT_DIRに変更します。

https://git-scm.com/docs/githooks/2.9.0


12
素晴らしい答え。後のリビジョン(2.13.0)で明確化されました。「例外は、プッシュ中にトリガーされるフック(pre-receive、update、post-receive、post-update、push-to-checkout)で、常に$ GIT_DIRで実行されます。」
初心者C

2
上記の引用のソース/コンテキスト:git-scm.com/docs/githooks#_description
jmcker

1
平易な言葉で:それはあなたのリポジトリのトップレベルのディレクトリです。(「ベア」は、本質的にのみからなるリポジトリを参照する.gitディレクトリ、およびどのファイルがチェックアウトされていないと。)
ベン・マレス

4

環境変数を使用できます$GIT_DIR。ディレクトリを$GIT_DIR指し.gitます。


$GIT_DIR/..リポジトリルートを指す可能性はどのくらいありますか?
デビッドロード

それは絶対確実ではありません。使用しないでください$GIT_DIR/..。リポジトリが裸のリポジトリである場合、それは壊れます。ベアリポジトリには作業ディレクトリがないため、「リポジトリルート」はありません。また、代わりに.gitがリンクの場合は壊れます。
holygeek 2015

1
考え出した。通常の使用でリポジトリルートを取得する方法はありますか?たとえば、プログラムの構成ファイルとしてリポジトリを使用するpre-commitフックの場合はどうでしょうか。
デビッドロード

3
これはすべての場合に正しいわけではありません。このブログを参照してください。
ghopper21 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.