チャプター ▾ 第2版

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

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

GIT_WORK_TREE は、ベアではないリポジトリの作業ディレクトリのルートの場所です。--git-dirまたはGIT_DIRが指定されているが、--work-treeGIT_WORK_TREEcore.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_PATHSPECSGIT_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はcurlライブラリを使用してHTTP経由でネットワーク操作を行うため、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 は、GitがHTTP経由で通信するときに使用するユーザーエージェント文字列を設定します。デフォルトはgit#2.0.0のような値です。

差分とマージ

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

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

GIT_DIFF_PATH_COUNTERGIT_DIFF_PATH_TOTAL は、GIT_EXTERNAL_DIFFまたはdiff.externalで指定されたプログラム内から便利です。前者は、一連のファイルでどのファイルが差分されているかを表し(1から始まる)、後者はバッチ内のファイルの総数です。

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

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

  • 1 は、競合のみを表示します。

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

  • 3 は、ファイルが変更されていないためにスキップされたときに表示します。

  • 4 は、処理されているすべてのパスを表示します。

  • 5 以上は、詳細なデバッグ情報を表示します。

デフォルト値は2です。

デバッグ

Gitが実際に何をしているかを知りたいですか? Gitにはかなり完全なトレースセットが埋め込まれており、それらを有効にするだけで済みます。これらの変数の可能な値は以下の通りです。

  • "true"、"1"、または "2" – トレースカテゴリはstderrに書き込まれます。

  • /で始まる絶対パス – トレース出力はそのファイルに書き込まれます。

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 は、パックファイルアクセスに関するトレースを制御します。最初のフィールドはアクセスされているパックファイル、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が何を検出しているかに関する情報を表示します。

$ 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_COMMAND を使用するか、ラッパースクリプトを作成してGIT_SSHをそれを指すように設定するか、~/.ssh/configファイルを使用できます。

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

GIT_ASKPASS は、core.askpass設定値のオーバーライドです。これは、Gitがユーザーに認証情報を要求する必要があるたびに呼び出されるプログラムで、コマンドライン引数としてテキストプロンプトを期待し、stdoutに回答を返す必要があります(このサブシステムの詳細については資格情報の保存を参照)。

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

GIT_FLUSH は、stdoutに増分的に書き込むときに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