Git
目次 ▾ 第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)\*.cのように、パススペックの先頭に:(glob)または:(literal)を付けることで、個々のケースでこれを上書きできます。

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<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つ表示される場合を除き、何も出力しません。

  • 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_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コマンドを設定します。コマンドはシェルによって解釈され、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 は、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