Git 🌙
Chapters â–Ÿ 2nd Edition

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ず珟圚のリポゞトリずのむンタフェヌス方法を決定するのに、いく぀かの環境倉数を䜿甚したす。

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