Git
Chapters ▾ 2nd Edition

10.8 Gitの内側 - 環境変数

環境変数

Gitは常に bash シェル内で実行されます。また、それがどのように動作するかを決定するために、多くのシェル環境変数を使用しています。 場合によっては、これらの環境変数が何であるか、Gitを望み通りに動かすためにどんなふうに使用できるかを知っていた方が便利です。 このリストは、Gitが参照する環境変数すべてを網羅してはいませんが、もっとも有用なものを取り上げています。

グローバルな振る舞い

Gitのコンピュータプログラムとしての一般的な動作の中には、環境変数に依存しているものがいくつかあります。

GIT_EXEC_PATH は、Gitがサブプログラム(git-commitgit-diff など)を探すディレクトリを決定します。 git --exec-path で現在の設定を確認できます。

HOME は通常カスタマイズされることを考慮されてはいません(他にこの変数に依存しているものがありすぎる)が、Gitはこのディレクトリからグローバル設定ファイルを探します。 Gitを完全にポータブルな状態でインストールしたいなら、グローバル設定をすべて埋めた上で、ポータブルなGitのシェルプロファイルで HOME を上書きできます。

PREFIX もそれと似ていますが、こちらはシステム全体の設定です。 Gitはこのファイルを $PREFIX/etc/gitconfig から探します。

GIT_CONFIG_NOSYSTEM を設定すると、システム全体の設定ファイルを無効にします。 これは、コマンドの実行にあたってシステム全体の設定が邪魔になるが、それを変更したり削除したりするアクセス権がない場合に便利です。

GIT_PAGER はコマンドラインで複数ページにわたる出力を表示する際に使用されるプログラムを制御します。 設定されていない場合、PAGER が代わりに使用されます。

GIT_EDITOR はテキスト(例えばコミットメッセージ)を編集する必要があるときにGitから起動されるエディタです。 設定されていない場合、 EDITOR が代わりに使用されます。

リポジトリの場所

Gitは、Gitと現在のリポジトリとのインタフェース方法を決定するのに、いくつかの環境変数を使用します。

GIT_DIR.git フォルダの場所です。 指定されていない場合、Gitはディレクトリツリーを ~ または / にたどり着くまで上っていき、各ディレクトリで .git ディレクトリを探します。

GIT_CEILING_DIRECTORIES.git ディレクトリを探す際の動作を制御します。 読み込みが遅いディレクトリにアクセスしている場合(例えばテープドライブ上のディレクトリや、低速なネットワーク越しにアクセスしている場合)、Gitが自動で停止するのを待たずに試行を停止させたくなることもあると思います。特に、シェルプロンプトを構成している最中にGitが呼ばれた場合はそうでしょう。

GIT_WORK_TREE は、ベアリポジトリ以外のリポジトリで、ワーキングディレクトリのルートとなる場所です。 指定されていない場合、 $GIT_DIR の親ディレクトリが代わりに使用されます。

GIT_INDEX_FILE は、インデックスファイルのパスです(ベアリポジトリ以外でのみ使用されます)。

GIT_OBJECT_DIRECTORY は、通常 .git/objects にあるディレクトリの場所を指定するのに使用できます。

GIT_ALTERNATE_OBJECT_DIRECTORIES は、 GIT_OBJECT_DIRECTORY にオブジェクトがなかった場合にチェックに行く場所を指示するのに使います。コロン区切りのリスト( /dir/one:/dir/two:… のような書式)で指定します。 大量のプロジェクトに、全く同じ内容の巨大なファイルがあるという状況で、そのファイルを大量に重複して保存したくない場合に、これが利用できます。

Pathspec

“pathspec” とは、Gitに何かのパスを指定する方法のことで、ワイルドカードの使用法などが含まれます。 以下の環境変数は .gitignore ファイルだけでなく、コマンドライン( git add *.c など)でも使用されます。

GIT_GLOB_PATHSPECS および GIT_NOGLOB_PATHSPECS は、pathspec において、ワイルドカードのデフォルトの動作を制御します。 GIT_GLOB_PATHSPECS に1がセットされている場合、ワイルドカード文字はワイルドカードとして働きます(これがデフォルトの挙動)。 GIT_NOGLOB_PATHSPECS に1がセットされている場合、ワイルドカード文字はそれ自身にのみマッチ、つまり *.c.c で終わる名前のファイルすべてではなく、 “*.c” という名前の ファイルにのみマッチします。 pathspec に :(glob):(literal) を、 :(glob)*.c のように指定することで、個々のケースに対してより優先的な設定を行うこともできます。

GIT_LITERAL_PATHSPECS は上記の振る舞いを両方とも無効にします。ワイルドカード文字は機能を停止し、オーバーライド接頭辞も無効化されます。

GIT_ICASE_PATHSPECS はすべての pathspec が大文字小文字を区別せず処理するように設定します。

コミット

Gitのコミットオブジェクトは通常、最終的に git-commit-tree によって作成されます。このコマンドは、以下の環境変数に設定されている情報を優先的に使用します。これらの環境変数が存在しない場合にのみ、設定ファイルの値が代わりに使用されます。

GIT_AUTHOR_NAME は “author” フィールドに使用される、人間に読める形式の名前です。

GIT_AUTHOR_EMAIL は “author” フィールドで使用するメールアドレスです。

GIT_AUTHOR_DATE は “author” フィールドで使用するタイムスタンプです。

GIT_COMMITTER_NAME は “committer” フィールドで使用する人名です。

GIT_COMMITTER_EMAIL は “committer” フィールドで使用するメールアドレスです。

GIT_COMMITTER_DATE は “committer” フィールドで使用するタイムスタンプです。

EMAIL は、設定値 user.email が設定されていない場合に代わりに使用されるメールアドレスです。 この環境変数自体が 設定されていない場合、Gitはシステムのユーザ名とホスト名を代わりに使用します。

ネットワーク

Git はHTTP越しのネットワーク操作に curl ライブラリを使用しています。そのため、 GIT_CURL_VERBOSE はそのライブラリが生成するメッセージをすべて出力するようGitに指示します。 これはコマンドラインで curl -v を実行するのと似たようなものです。

GIT_SSL_NO_VERIFY は、SSL証明書の検証を行わないようにGitへ指示します。 これは、GitリポジトリをHTTPS経由で利用するために自己署名証明書を使っている場合や、Gitサーバーのセットアップ中で正式な証明書のインストールが完了していない場合などに必要になります。

あるHTTP操作のデータレートが秒間 GIT_HTTP_LOW_SPEED_LIMIT バイトより低い状態が、 GIT_HTTP_LOW_SPEED_TIME 秒より長く続いた場合、Gitはその操作を中断します。 これらの環境変数は設定ファイルの http.lowSpeedLimit および http.lowSpeedTime の値より優先されます。

GIT_HTTP_USER_AGENT はGitがHTTPで通信する際のuser-agent文字列を設定します。 デフォルトの値は git/2.0.0 のような内容です。

差分取得とマージ

GIT_DIFF_OPTS ですが、これは名前の付け方に少し問題ありと言えます。 有効な値は -u<n> または --unified=<n> だけです。これは、 git diff コマンドで表示されるコンテキスト行の行数を制御します。

GIT_EXTERNAL_DIFF は設定ファイルの diff.external の値をオーバーライドします。 設定されている場合、ここで指定したプログラムが git diff の実行時に呼び出されます。

GIT_DIFF_PATH_COUNTER および GIT_DIFF_PATH_TOTAL は、 GIT_EXTERNAL_DIFF または diff.external で指定したプログラムの内部で使用すると便利です。 前者は、処理中の一連のファイルの中で何番目のファイルの差分を処理しているか(1から始まる数値)、後者は処理中の一連のファイルの総数です。

  • GIT_MERGE_VERBOSITY * は、再帰的なマージ戦略の出力を制御します。 指定できる値は以下の通りです。

  • 0 は何も出力しません。例外として、エラーがあった場合はエラーメッセージを1つだけ出力します。

  • 1 はマージコンフリクトのみ表示します。

  • 2 はファイルの変更点のみ表示します。

  • 3 は変更がなく処理をスキップしたファイルを表示します。

  • 4 は処理されたパスをすべて表示します。

  • 5 以上を指定すると、上記のすべてに加えて詳細なデバッグ用の情報を表示します。

デフォルト値は2です。

デバッグ

Gitが何をしているか、 本当に 知りたいですか? Gitには、組み込みのトレースのほぼ完全なセットが備わっており、ユーザがする必要があるのは、それらをオンにすることだけです。 これらの環境変数に設定可能な値は次の通りです。

  • “true”、“1”、“2” – 対象のカテゴリのトレースは標準エラー出力へ書き出されます。

  • / から始まる絶対パス文字列 – 対象のトレースの出力はそのファイルへ書き出されます。

GIT_TRACE は、どの特定のカテゴリにも当てはまらない、一般的なトレースを制御します。 これには、エイリアスの展開や、他のサブプログラムへの処理の引き渡しなどが含まれます。

$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554               trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341       trace: run_command: 'git-lga'
20:12:49.879529 git.c:282               trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349               trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341       trace: run_command: 'less'
20:12:49.899675 run-command.c:192       trace: exec: 'less'

GIT_TRACE_PACK_ACCESS はパックファイルへのアクセスに関するトレースを制御します。 最初のフィールドはアクセスされているパックファイル、次のフィールドはそのファイル内でのオフセットです。

$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

GIT_TRACE_PACKET はネットワーク操作におけるパケットレベルのトレースを有効にします。

$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46           packet:          git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46           packet:          git< 0000
20:15:14.867079 pkt-line.c:46           packet:          git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46           packet:          git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46           packet:          git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]

GIT_TRACE_PERFORMANCE は性能データのログ出力を制御します。 ログには、一つ一つのGit呼び出しにかかった時間が出力されます。

$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414             performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414             performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414             performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414             performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414             performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414             performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414             performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414             performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414             performance: 6.112217000 s: git command: 'git' 'gc'

GIT_TRACE_SETUP はGitがリポジトリや環境を操作する際に何を見ているかを表示します。

$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315             setup: git_dir: .git
20:19:47.087184 trace.c:316             setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317             setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318             setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

その他

GIT_SSH は、指定されている場合、GitがSSHホストへ接続する際に ssh の代わりに呼び出されるプログラムです。 これは $GIT_SSH [username@]host [-p <port>] <command> のように呼び出されます。 注意事項として、これは ssh の呼び出し方をカスタマイズする最も手軽な方法というわけではありません。追加のコマンドラインパラメタがサポートされないので、ラッパースクリプトを書いて、 GIT_SSH がそのスクリプトを指すようにする必要があります。 その場合は単に ~/.ssh/config ファイルを使用する方が簡単でしょう。

GIT_ASKPASS は設定ファイルの core.askpass の値をオーバーライドします。 これはユーザによる認証情報の入力が必要なときに呼び出されるプログラムで、コマンドライン引数としてプロンプトのテキストを受け取り、応答を標準出力へ返すようになっている必要があります。 (このサブシステムの詳細については 認証情報の保存 を参照してください)

GIT_NAMESPACE は名前空間内の参照へのアクセス制御を行います。これは --namespace フラグと同様です。 これがもっとも便利なのは、サーバーで一つのリポジトリの複数のフォークを単一のリポジトリへ格納したいが、参照だけは別々に分けておきたい場合です。

GIT_FLUSH は、Gitに非バッファI/Oを使用するように強制します。標準出力への書き出しを逐次的に行いたい場合に使用します。 1を設定すると、Gitは出力をより頻繁にフラッシュします。0を設定すると、すべての出力がバッファリングされます。 デフォルト(この環境変数が設定されていない場合)では、動作と出力モードに合わせて適切なバッファリングスキームが選択されます。

GIT_REFLOG_ACTION では、reflogへ出力される説明用のテキストを指定できます。 次に例を示します。

$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message'
[master 9e3d55a] my message
$ git reflog -1
9e3d55a HEAD@{0}: my action: my message