2017-02-17 10 views
3

デプロイメントの一部として別のレポを複製するgit post-receiveフックを書いています。特定のフォルダにリポジトリをクローンし、その後のgitコマンドで-Cオプションを使用して、チェックアウトされたリポジトリのディレクトリにディレクトリを設定します(man pageに記載されています)。gitフックでrepoを操作するときの-Cと--git-dirの違い

コマンドラインから手動で実行すると、フックが正常に動作しますが、フックがgitによって実行されたとき(つまり、プッシュが受信されたとき)、コマンドはfatal: Not a git repository: '.'で失敗します。私がを--git-dirのために交換するとき、それは動作します。

これは、再現裸のレポgit init --bareを作成し、内容の実行可能フックにするために非常に簡単です:期待どおりに動作します、コマンドラインからスクリプトを実行する

#!/bin/bash 
set -xe 

SOME_REPO_URL=???? # Some repo that is not this one 
repopath=/tmp/somerepo 

git clone $SOME_REPO_URL $repopath 

# 1: This fails when run through the git hook 
git -C $repopath checkout -b somebranch HEAD~1 

# 2: This works every time 
# git --git-dir $repopath/.git checkout -b somebranch HEAD~1 

をしていますが、にプッシュするときrepoは失敗するでしょう。 1にコメントし、2をコメント解除すると、どちらの場合でも機能します。

これは意図された動作であることを示すドキュメントは見つかりません - 説明は理解できます。

これは、Ubuntu 16.04でgit 2.7.4です。

+0

'GIT_DIR'環境変数がフックで設定されていることがわかります。 checkoutコマンドを実行している間に設定を解除することができます。 –

答えて

2

間リテラル差:

git -C directory git-sub-command ...

と:

git --git-dir directory git-sub-command ...

フロントエンドセットアッププログラムgit動作(os.chdir "に変更ディレクトリ" OSレベルを使用することですPythonからはchdir()、Cなどから)、最初には環境変数$GIT_DIRを設定します。どちらの場合も、サブコマンドを探して実行します。実際にの両方を実行することができます(-Cの複数の効果と-C--git-dirの間のやり取りを含む)。This is documented

しかし、それはちょうど1つのレベルの問題を押し下げる:今、あなたはそれが現在の作業ディレクトリを持つよりも$GIT_DIRとは異なる何git-checkoutgit --exec-pathディレクトリにあります)知っている必要があります。直接的な答えはthe top level git command documentation, under the ENVIRONMENT VARIABLES sectionである:

GIT_DIR
GIT_DIR環境変数が設定されている場合、それはリポジトリのベースにデフォルト.gitの代わりに使用するパスを指定します。 --git-dirコマンドラインオプションもこの値を設定します。

ここではJan Krüger's commentが入ります.Gitフックを書くときは、Gitが環境変数を設定する可能性があることに注意する必要があります。 $GIT_DIRが相対パス名に設定されていて、それを上書きせずにディレクトリを変更した場合は、さまざまなGitサブコマンドのすべての方法を変更します。したがって、un -set(デフォルトの$GIT_DIR -not-setビヘイビア)にするか、絶対パスに明示的に設定するか(ディレクトリの変更を超えて保持するため)、または明示的にpath-relativeまたはpath-relativeに設定する必要があります。他のリポジトリの絶対的なものは、あなたの行動に応じてが必要です。--work-treeセット$GIT_WORK_TREE、および他の同様の変数がありますが、-は、少なくともすべてのGitのバージョンで$GIT_DIRをタのデータにすること

注意:-)「あなたのための事前設定」のみである(または「あなたの迷惑のための」 )Gitフックで。

関連する問題