-
1. 使い始める
- 1.1 バージョン管理に関して
- 1.2 Git略史
- 1.3 Gitの基本
- 1.4 コマンドライン
- 1.5 Gitのインストール
- 1.6 最初のGitの構成
- 1.7 ヘルプを見る
- 1.8 まとめ
-
2. Git の基本
- 2.1 Git リポジトリの取得
- 2.2 変更内容のリポジトリへの記録
- 2.3 コミット履歴の閲覧
- 2.4 作業のやり直し
- 2.5 リモートでの作業
- 2.6 タグ
- 2.7 Git エイリアス
- 2.8 まとめ
-
3. Git のブランチ機能
- 3.1 ブランチとは
- 3.2 ブランチとマージの基本
- 3.3 ブランチの管理
- 3.4 ブランチでの作業の流れ
- 3.5 リモートブランチ
- 3.6 リベース
- 3.7 まとめ
-
4. Gitサーバー
- 4.1 プロトコル
- 4.2 サーバー用の Git の取得
- 4.3 SSH 公開鍵の作成
- 4.4 サーバーのセットアップ
- 4.5 Git デーモン
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 サードパーティによる Git ホスティング
- 4.10 まとめ
-
5. Git での分散作業
- 5.1 分散作業の流れ
- 5.2 プロジェクトへの貢献
- 5.3 プロジェクトの運営
- 5.4 まとめ
-
6. GitHub
- 6.1 アカウントの準備と設定
- 6.2 プロジェクトへの貢献
- 6.3 プロジェクトのメンテナンス
- 6.4 組織の管理
- 6.5 スクリプトによる GitHub の操作
- 6.6 まとめ
-
7. Git のさまざまなツール
- 7.1 リビジョンの選択
- 7.2 対話的なステージング
- 7.3 作業の隠しかたと消しかた
- 7.4 作業内容への署名
- 7.5 検索
- 7.6 歴史の書き換え
- 7.7 リセットコマンド詳説
- 7.8 高度なマージ手法
- 7.9 Rerere
- 7.10 Git によるデバッグ
- 7.11 サブモジュール
- 7.12 バンドルファイルの作成
- 7.13 Git オブジェクトの置き換え
- 7.14 認証情報の保存
- 7.15 まとめ
-
8. Git のカスタマイズ
- 8.1 Git の設定
- 8.2 Git の属性
- 8.3 Git フック
- 8.4 Git ポリシーの実施例
- 8.5 まとめ
-
9. Gitとその他のシステムの連携
- 9.1 Git をクライアントとして使用する
- 9.2 Git へ移行する
- 9.3 まとめ
-
10. Gitの内側
- 10.1 配管(Plumbing)と磁器(Porcelain)
- 10.2 Gitオブジェクト
- 10.3 Gitの参照
- 10.4 Packfile
- 10.5 Refspec
- 10.6 転送プロトコル
- 10.7 メンテナンスとデータリカバリ
- 10.8 環境変数
- 10.9 まとめ
-
A1. 付録 A: その他の環境でのGit
- A1.1 グラフィカルインタフェース
- A1.2 Visual StudioでGitを使う
- A1.3 EclipseでGitを使う
- A1.4 BashでGitを使う
- A1.5 ZshでGitを使う
- A1.6 PowershellでGitを使う
- A1.7 まとめ
-
A2. 付録 B: Gitをあなたのアプリケーションに組み込む
- A2.1 Gitのコマンドラインツールを使う方法
- A2.2 Libgit2を使う方法
- A2.3 JGit
-
A3. 付録 C: Gitのコマンド
- A3.1 セットアップと設定
- A3.2 プロジェクトの取得と作成
- A3.3 基本的なスナップショット
- A3.4 ブランチとマージ
- A3.5 プロジェクトの共有とアップデート
- A3.6 検査と比較
- A3.7 デバッグ
- A3.8 パッチの適用
- A3.9 メール
- A3.10 外部システム
- A3.11 システム管理
- A3.12 配管コマンド
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