章 ▾ 第2版

10.8 Gitの内側 - 環境変数

環境変数

Gitは常に`bash`シェル内で動作し、その挙動を決定するためにいくつかのシェル環境変数を使用します。これらの変数が何であり、どのようにGitを意図した通りに動作させるために使用できるかを知っておくと、時々役立ちます。これはGitが注意を払うすべての環境変数の網羅的なリストではありませんが、最も有用なものを扱います。

グローバルな挙動

コンピュータプログラムとしてのGitの一般的な挙動の一部は、環境変数に依存します。

`GIT_EXEC_PATH`は、Gitがそのサブプログラム(`git-commit`、`git-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_DIR`は、`.git`フォルダーの場所です。これが指定されていない場合、Gitは`~`または`/`に到達するまでディレクトリツリーを上にたどり、各ステップで`.git`ディレクトリを探します。

`GIT_CEILING_DIRECTORIES`は、`.git`ディレクトリの検索動作を制御します。ロードが遅いディレクトリ(テープドライブ上のものや、低速なネットワーク接続を介したものなど)にアクセスする場合、特にシェルプロンプトを構築するときにGitが呼び出される場合は、Gitが通常よりも早く検索を停止するように設定したいかもしれません。

`GIT_WORK_TREE`は、非ベアリポジトリの作業ディレクトリのルートの場所です。`--git-dir`または`GIT_DIR`が指定されていても、`--work-tree`、`GIT_WORK_TREE`、または`core.worktree`のいずれも指定されていない場合、現在の作業ディレクトリが作業ツリーの最上位として扱われます。

`GIT_INDEX_FILE`は、インデックスファイルへのパスです(非ベアリポジトリのみ)。

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

`GIT_ALTERNATE_OBJECT_DIRECTORIES`はコロン区切りリスト(`/dir/one:/dir/two:…`のような形式)で、`GIT_OBJECT_DIRECTORY`にオブジェクトがない場合にGitにどこをチェックするかを指示します。大量のプロジェクトで全く同じ内容の大きなファイルがある場合、これによりそれらのコピーを多数保存するのを避けることができます。

パススペック

「パススペック」とは、ワイルドカードの使用を含め、Gitでパスを指定する方法を指します。これらは`.gitignore`ファイルで使用されるほか、コマンドライン(`git add *.c`)でも使用されます。

`GIT_GLOB_PATHSPECS``GIT_NOGLOB_PATHSPECS`は、パススペックにおけるワイルドカードのデフォルトの挙動を制御します。`GIT_GLOB_PATHSPECS`が1に設定されている場合、ワイルドカード文字はワイルドカードとして機能します(これがデフォルトです)。`GIT_NOGLOB_PATHSPECS`が1に設定されている場合、ワイルドカード文字はそれ自体にのみ一致し、`*.c`のようなものは、名前が`.c`で終わる任意のファイルではなく、名前が「\*.c」であるファイルのみに一致します。個々のケースでは、`:(glob)`または`:(literal)`でパススペックを開始することでこれを上書きできます。例えば`:(glob)\*.c`のように。

`GIT_LITERAL_PATHSPECS`は上記の両方の挙動を無効にします。ワイルドカード文字は機能せず、上書きプレフィックスも無効になります。

`GIT_ICASE_PATHSPECS`は、すべてのパススペックを大文字と小文字を区別しない方法で動作するように設定します。

コミット

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`は、GitにSSL証明書を検証しないように指示します。これは、HTTPS経由でGitリポジトリを提供するのに自己署名証明書を使用している場合や、Gitサーバーのセットアップ中だがまだ完全な証明書をインストールしていない場合に、必要となることがあります。

HTTP操作のデータレートが`GIT_HTTP_LOW_SPEED_LIMIT`バイト/秒よりも低く、それが`GIT_HTTP_LOW_SPEED_TIME`秒以上続いた場合、Gitはその操作を中止します。これらの値は、`http.lowSpeedLimit`と`http.lowSpeedTime`の設定値を上書きします。

`GIT_HTTP_USER_AGENT`は、HTTP経由で通信する際にGitが使用するユーザーエージェント文字列を設定します。デフォルトは`git#2.0.0`のような値です。

差分表示とマージ

`GIT_DIFF_OPTS`は少々誤解を招く名前です。有効な値は`-u`または`--unified=`のみであり、`git diff`コマンドで表示されるコンテキスト行数を制御します。

`GIT_EXTERNAL_DIFF`は`diff.external`設定値の上書きとして使用されます。これが設定されている場合、`git diff`が呼び出されたときにGitはこのプログラムを起動します。

`GIT_DIFF_PATH_COUNTER``GIT_DIFF_PATH_TOTAL`は、`GIT_EXTERNAL_DIFF`または`diff.external`で指定されたプログラム内から使用すると便利です。前者はシリーズのどのファイルが差分表示されているか(1から始まる)を表し、後者はバッチ内のファイルの総数です。

`GIT_MERGE_VERBOSITY`は、再帰的なマージ戦略の出力を制御します。許可される値は以下の通りです

  • 0は、おそらく単一のエラーメッセージを除いて、何も出力しません。

  • 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`は、packfileへのアクセス追跡を制御します。最初のフィールドはアクセスされているpackfileで、2番目のフィールドはそのファイル内のオフセットです。

$ 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 ] `のように呼び出されます。これは`ssh`の呼び出し方をカスタマイズする最も簡単な方法ではないことに注意してください。追加のコマンドラインパラメータをサポートしません。追加のコマンドラインパラメータをサポートするには、`GIT_SSH_COMMAND`を使用するか、ラッパースクリプトを記述して`GIT_SSH`でそれを指すように設定するか、または`~/.ssh/config`ファイルを使用できます。

`GIT_SSH_COMMAND`は、GitがSSHホストに接続しようとするときに使用されるSSHコマンドを設定します。このコマンドはシェルによって解釈され、`ssh`に追加のコマンドライン引数を使用できます。たとえば、`GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo`のように。

`GIT_ASKPASS`は、`core.askpass`設定値の上書きです。これはGitがユーザーに認証情報を要求する必要があるたびに呼び出されるプログラムで、コマンドライン引数としてテキストプロンプトを期待し、`stdout`に応答を返す必要があります(このサブシステムについては認証情報ストレージを参照してください)。

`GIT_NAMESPACE`は名前空間付き参照へのアクセスを制御し、`--namespace`フラグと同等です。これは主にサーバー側で有用であり、単一のリポジトリの複数のフォークを1つのリポジトリに保存し、参照のみを分離したい場合に役立ちます。

`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
scroll-to-top