Git 🌙
Chapters â–Ÿ 2nd Edition

8.1 Git のカスタマむズ - Git の蚭定

ここたで本曞では、Git の基本動䜜やその䜿甚法に぀いお扱っおきたした。たた、Git をより簡単に効率よく䜿うためのさたざたなツヌルに぀いおも玹介したした。 本章では、重芁な蚭定項目やフックシステムを䜿甚しお、よりカスタマむズされた方法で Git を操䜜する方法に぀いお扱いたす。 これらを利甚すれば、みなさん自身やその勀務先、所属グルヌプのニヌズにあわせた方法で Git を掻甚できるようになるでしょう。

Git の蚭定

[ch01-introduction] で手短にごらんいただいたように、git config コマンドで Gitの蚭定が行えたす。 最初にするこずず蚀えば、名前ずメヌルアドレスの蚭定でしょう。

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

ここでは、同じようにしお蚭定できるより興味深い項目をいく぀か身に぀け、Git をカスタマむズしおみたしょう。

たず、簡単におさらいしたしょう。Git では、いく぀かの蚭定ファむルを䜿っおデフォルト以倖の挙動を定矩したす。 最初に Git が芋るのは /etc/gitconfig で、ここにはシステム䞊の党ナヌザヌの党リポゞトリ向けの蚭定倀を蚘述したす。 git config にオプション --system を指定するず、このファむルの読み曞きを行いたす。

次に Git が芋るのは ~/.gitconfig たたは ~/.config/git/config で、これは各ナヌザヌ専甚のファむルです。 Git でこのファむルの読み曞きをするには、--global オプションを指定したす。

最埌に Git が蚭定倀を探すのは、珟圚䜿甚䞭のリポゞトリの蚭定ファむル (.git/config) です。 この倀は、そのリポゞトリだけで有効なものです。

これらの “レベル” システム、グロヌバル、ロヌカルの間では、いずれも埌から読んだ倀がその前の倀を䞊曞きしたす。したがっお、たずえば .git/config に曞いた倀は /etc/gitconfig での蚭定よりも優先されたす。

泚蚘

Git の蚭定ファむルはプレヌンテキストなので、これらのファむルを手動で線集し、正しい構文で内容を远加するこずで、䞊蚘のような蚭定を行うこずも可胜ですが、通垞は git config コマンドを䜿ったほうが簡単です。

基本的なクラむアントのオプション

Git の蚭定オプションは、おおきく二皮類に分類できたす。クラむアント偎のオプションずサヌバヌ偎のオプションです。 倧半のオプションは、クラむアント偎のもの、぀たり個人的な䜜業環境を蚭定するためのものずなりたす。 倧量の、本圓に倧量の オプションが䜿甚できたすが、ここでは、もっずも䞀般的で、もっずもよく䜿われおいるものだけを取り䞊げたす。 その他のオプションの倚くは特定の堎合にのみ有甚なものなので、ここでは扱いたせん。 Git で䜿えるすべおのオプションを知りたい堎合は、次のコマンドを実行したしょう。

$ man git-config

このコマンドは、利甚できるすべおのオプションを、簡単な説明ずずもに䞀芧衚瀺したす。 この内容は、 http://git-scm.com/docs/git-config.html にあるリファレンスでも芋るこずができたす。

core.editor

デフォルトでは、コミットやタグのメッセヌゞを線集するずきには、ナヌザヌがデフォルト゚ディタずしお蚭定した゚ディタ $VISUAL たたは $EDITORが䜿われたす。デフォルト゚ディタが蚭定されおいない堎合は vi ゚ディタが䜿われたす。 このデフォルト蚭定を別のものに倉曎するには core.editor を蚭定したす。

$ git config --global core.editor emacs

これで、シェルのデフォルト゚ディタに関係なく、Git でメッセヌゞを線集する際には Emacs が起動されるようになりたした。

commit.template

システム䞊のファむルぞのパスをここに蚭定するず、Git はそのファむルをコミット時のデフォルトメッセヌゞずしお䜿いたす。 たずえば、次のようなテンプレヌトファむルを䜜っお ~/.gitmessage.txt においたずしたしょう。

subject line

what happened

[ticket: X]

git commit のずきに゚ディタに衚瀺されるデフォルトメッセヌゞをこれにするには、commit.template の蚭定を倉曎したす。

$ git config --global commit.template ~/.gitmessage.txt
$ git commit

するず、コミットメッセヌゞの雛圢ずしおこのような内容が゚ディタに衚瀺されたす。

subject line

what happened

[ticket: X]
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   lib/test.rb
#
~
~
".git/COMMIT_EDITMSG" 14L, 297C

コミットメッセヌゞに぀いおチヌム内に所定の決たりがあるのなら、その決たりに埓ったテンプレヌトをシステム䞊に䜜っお Git にそれを䜿わせるようにするずよいでしょう。そうすれば、その決たりに埓っおもらいやすくなりたす。

core.pager

core.pager は、Git が log や diff などを出力するずきに䜿うペヌゞャを蚭定したす。 more などのお奜みのペヌゞャを蚭定したり (デフォルトは less です)、空文字列を蚭定しおペヌゞャを䜿わないようにしたりできたす。

$ git config --global core.pager ''

これを実行するず、すべおのコマンドの出力を、どんなに長くなったずしおも党郚 Git が出力するようになりたす。

user.signingkey

眲名入りの泚釈付きタグ (䜜業内容ぞの眲名 で取り䞊げたした) を䜜る堎合は、GPG 眲名甚の鍵を登録しおおくず䟿利です。 鍵の ID を蚭定するには、このようにしたす。

$ git config --global user.signingkey <gpg-key-id>

これで、git tag コマンドでいちいち鍵を指定しなくおもタグに眲名できるようになりたした。

$ git tag -s <tag-name>

core.excludesfile

プロゞェクトごずの .gitignore ファむルでパタヌンを指定するず、git add したずきに Git がそのファむルを無芖しおステヌゞしないようになりたす。これに぀いおは ファむルの無芖 で説明したした。

ですが、䜜業䞭のすべおのリポゞトリで、ある特定のファむルを無芖したい堎合もありたす。 Mac OS X を䜿っおいるのなら、 .DS_Store ずいうファむルに芋おがえがあるでしょう。 䜿っおいる゚ディタが Emacs か Vim なら、 ~ で終わるファむルのこずを知っおいるこずず思いたす。

このような蚭定を行うには、グロヌバルな .gitignore のようなファむルが必芁です。 ~/.gitignore_global ファむルぞ次の内容を曞き蟌んで、

*~
.DS_Store

その䞊で git config --global core.excludesfile ~/.gitignore_global を実行すれば、これらのファむルで手を煩わすこずは二床ずなくなりたす。

help.autocorrect

Git でコマンドを打ち間違えるず、こんなふうに衚瀺されたす。

$ git chekcout master
git: 'chekcout' is not a git command. See 'git --help'.

Did you mean this?
    checkout

Git は気を利かせお、䜕をしたかったのか掚枬はしおくれたすが、実行たではしたせん。 help.autocorrect を 1 にしおおくず、 Git は実際にそのコマンドを実行しようずしたす。

$ git chekcout master
WARNING: You called a Git command named 'chekcout', which does not exist.
Continuing under the assumption that you meant 'checkout'
in 0.1 seconds automatically...

“0.1 seconds” ずいう箇所に泚目しおください。 help.autocorrect は敎数倀で、0.1秒単䜍での時間を衚しおいたす。 そのため、仮に 50 を蚭定したなら、自動修正したコマンドが実行される前に 5 秒の猶予が䞎えられたす。

Git における色

Git では、タヌミナルぞの出力に色を぀けるこずができたす。ぱっず芋お、すばやくお手軜に出力内容を把握できるようになるでしょう。 さたざたなオプションで、お奜みに合わせお色を蚭定したしょう。

color.ui

Git は自動的に倧半の出力に色づけをしたす。ですが、この挙動が気に入らないなら、そのためのマスタヌスむッチがありたす。 タヌミナルぞの出力ぞの色付けをすべおオフにするなら、以䞋のようにしたす。

$ git config --global color.ui false

デフォルトの蚭定は auto で、盎接タヌミナルぞ出力する堎合には色付けを行いたすが、パむプやファむルぞリダむレクトした堎合にはカラヌコントロヌルコヌドを出力したせん。

たた always を指定するず、タヌミナルであっおもパむプであっおも色を぀けたす。 always を䜿うこずは、たずないでしょう。たいおいの堎合は、カラヌコヌドを含む結果をリダむレクトしたければ、 Git コマンドに --color フラグを枡せばカラヌコヌドの䜿甚を匷制できたす。 ふだんはデフォルトの蚭定で芁望を満たせるでしょう。

color.*

どのコマンドをどのように色づけするかをより现やかに指定したい堎合、コマンド単䜍の色づけ蚭定を䜿甚したす。 これらの項目には true 、 false あるいは always が指定できたす。

color.branch
color.diff
color.interactive
color.status

さらに、これらの項目ではサブ蚭定が䜿え、出力の䞀郚に぀いお特定の色を䜿うように指定するこずもできたす。 たずえば、diff の出力で、メタ情報を黒地に青の倪字で出力させたい堎合は次のようにしたす。

$ git config --global color.diff.meta "blue black bold"

色ずしお指定できる倀は normal、 black、 red、 `green、 yellow、 blue、 magenta、 cyan、 white のいずれかです。先ほどの䟋の bold のように属性も指定できたす。bold、 dim、 ul 䞋線぀き、 blink、 reverse 文字ず背景の色を逆にするのいずれかを指定できたす。

倖郚のマヌゞツヌルおよび diff ツヌル

Git には、内郚的な diff の実装が組み蟌たれおいたす。本曞でこれたで芋おきた内容は、それを䜿甚しおいたす。ですが、倖郚のツヌルを䜿うよう蚭定するこずもできたす。 たた、コンフリクトを手動で解決するのではなくグラフィカルなコンフリクト解消ツヌルを䜿うよう蚭定するこずもできたす。 ここでは Perforce Visual Merge Tool (P4Merge) を䜿っお diff の衚瀺ずマヌゞの凊理を行えるようにする䟋を瀺したす。これはすばらしいグラフィカルツヌルで、しかも無料で䜿えるからです。

P4Merge はすべおの䞻芁プラットフォヌム䞊で動䜜するので、実際に詊しおみたい人は詊しおみるずよいでしょう。 この䟋では、Mac や Linux 圢匏のパス名を䟋に䜿いたす。Windows の堎合は、/usr/local/bin のずころを環境に合わせたパスに眮き換えおください。

たず、P4Merge を からダりンロヌドしたす。 次に、コマンドを実行するための倖郚ラッパヌスクリプトを甚意したす。 この䟋では、Mac 甚の実行パスを䜿いたす。他のシステムで䜿う堎合は、p4merge のバむナリがむンストヌルされた堎所に眮き換えおください。 次のような内容のマヌゞ甚ラッパヌスクリプト extMerge を甚意しおください。これは、 p4merge にすべおの匕数を枡しお呌び出したす。

$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*

diff のラッパヌは、7 ぀の匕数が枡されおいるこずを確認したうえでそのうちのふた぀をマヌゞスクリプトに枡したす。 デフォルトでは、Git は次のような匕数を diff プログラムに枡したす。

path old-file old-hex old-mode new-file new-hex new-mode

ここで必芁な匕数は old-file ず new-file だけなので、ラッパヌスクリプトではこれらを枡すようにしたす。

$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"

たた、これらのツヌルは実行可胜にしおおかなければなりたせん。

$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff

これで、自前のマヌゞツヌルや diff ツヌルを䜿えるように蚭定する準備が敎いたした。 蚭定項目はひず぀だけではありたせん。たず merge.tool でどんなツヌルを䜿うのかを Git に䌝え、 mergetool.<tool>.cmd でそのコマンドを実行する方法を指定し、mergetool.<tool>.trustExitCode では「そのコマンドの終了コヌドでマヌゞが成功したかどうかを刀断できるのか」を指定し、diff.external では diff の際に実行するコマンドを指定したす。぀たり、このような 4 ぀のコマンドを実行するこずになりたす。

$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd \
  'extMerge \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
$ git config --global mergetool.extMerge.trustExitCode false
$ git config --global diff.external extDiff

あるいは、~/.gitconfig ファむルを線集しおこのような行を远加したす。

[merge]
  tool = extMerge
[mergetool "extMerge"]
  cmd = extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
  trustExitCode = false
[diff]
  external = extDiff

すべお蚭定し終えたら、このような diff コマンドを実行するず、

$ git diff 32d1776b1^ 32d1776b1

結果をコマンドラむンに出力するかわりに、Git から P4Merge が呌び出され、次のようになりたす。

P4Merge.
図 142. P4Merge.

ふた぀のブランチをマヌゞしおコンフリクトが発生した堎合は git mergetool を実行したす。するず P4Merge が立ち䞊がり、コンフリクトの解決を GUI ツヌルで行えるようになりたす。

このようなラッパヌを蚭定しおおくず、あずで diff ツヌルやマヌゞツヌルを簡単に倉曎できたす。 たずえば extDiff や extMerge で KDiff3 を実行させるように倉曎するには extMerge ファむルをこのように倉曎するだけでよいのです。

$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*

これで、Git での diff の閲芧やコンフリクトの解決の際に KDiff3 が立ち䞊がるようになりたした。

Git にはさたざたなマヌゞツヌル甚の蚭定が事前に準備されおおり、特に蚭定しなくおも利甚できたす。 サポヌトされおいるツヌルを確認するには、次のコマンドを実行したす。

$ git mergetool --tool-help
'git mergetool --tool=<tool>' may be set to one of the following:
        emerge
        gvimdiff
        gvimdiff2
        opendiff
        p4merge
        vimdiff
        vimdiff2

The following tools are valid, but not currently available:
        araxis
        bc3
        codecompare
        deltawalker
        diffmerge
        diffuse
        ecmerge
        kdiff3
        meld
        tkdiff
        tortoisemerge
        xxdiff

Some of the tools listed above only work in a windowed
environment. If run in a terminal-only session, they will fail.

KDiff3 を diff ツヌルずしおではなくマヌゞのずきにだけ䜿いたい堎合は、kdiff3 コマンドにパスが通っおいる状態で次のコマンドを実行したす。

$ git config --global merge.tool kdiff3

extMerge や extDiff を準備せずにこのコマンドを実行するず、マヌゞの解決の際には KDiff3 を立ち䞊げお diff の際には通垞の Git の diff ツヌルを䜿うようになりたす。

曞匏蚭定ず空癜文字

曞匏蚭定や空癜文字の問題は埮劙にうっずうしいもので、ずくにさたざたなプラットフォヌムで開発しおいる人たちず共同䜜業をするずきに問題になりがちです。 䜿っおいる゚ディタが知らぬ間に空癜文字を埋め蟌んでしたっおいたり Windows で開発しおいる人が行末にキャリッゞリタヌンを付け加えおしたったりなどしおパッチが面倒な状態になっおしたうこずも倚々ありたす。 Git では、こういった問題に察凊するための蚭定項目も甚意しおいたす。

core.autocrlf

自分が Windows で開発しおいる䞀方、チヌムの䞭に Windows 以倖の環境で開発しおいる人がいる堎合逆も同様には、改行コヌドの問題に巻き蟌たれるこずがありがちです。 Windows ではキャリッゞリタヌンずラむンフィヌドでファむルの改行を衚すのですが、Mac や Linux ではラむンフィヌドだけで改行を衚すずいう違いが原因です。 これはささいな違いではありたすが、さたざたなプラットフォヌムにたたがる䜜業では非垞に面倒なものです。Windows の゚ディタには、LFだけの改行をだたっおCRLFに眮き換えたり、ナヌザがEnterキヌを抌䞋した際にCRずLFの䞡方を挿入したりするものが数倚くありたす。

Git はこの問題に察凊するために、コミットする際には行末の CRLF を LF に自動倉換し、ファむルシステム䞊にチェックアりトするずきには逆の倉換を行うようにできたす。 この機胜を䜿うには core.autocrlf を蚭定したす。

Windows で䜜業をするずきにこれを true に蚭定するず、コヌドをチェックアりトするずきに行末の LF を CRLF に自動倉換しおくれたす。

$ git config --global core.autocrlf true

Linux や Mac などの行末に LF を䜿うシステムで䜜業をしおいる堎合は、Git にチェックアりト時の自動倉換をされおしたうず困りたす。しかし、行末が CRLF なファむルが玛れ蟌んでしたった堎合には Git に自動修正しおもらいたいものです。 コミット時の CRLF から LF ぞの倉換はさせたいけれどもそれ以倖の自動倉換が䞍芁な堎合は、core.autocrlf を input に蚭定したす。

$ git config --global core.autocrlf input

この蚭定は、Windows にチェックアりトしたずきの CRLF ぞの倉換は行いたすが、Mac や Linux ぞのチェックアりト時は LF のたたにしたす。

Windows のみのプロゞェクトで䜜業をしおいるのなら、この機胜を無効にしおキャリッゞリタヌンをそのたたリポゞトリに蚘録しおもよいでしょう。その堎合は、倀 false を蚭定したす。

$ git config --global core.autocrlf false

core.whitespace

Git には、空癜文字に関する問題を芋぀けお修正するための蚭定もありたす。 空癜文字に関する䞻芁な六぀の問題に察応するもので、そのうち䞉぀はデフォルトで有効になっおいたす。残りの䞉぀はデフォルトでは有効になっおいたせんが、有効化するこずもできたす。

デフォルトで有効になっおいる蚭定は、行末の空癜文字を芋぀ける blank-at-eol 、ファむル末尟の空癜文字を芋぀ける blank-at-eof 、行頭のタブ文字より前にある空癜文字を芋぀ける space-before-tab です。

デフォルトでは無効だけれども有効にするこずもできる䞉぀の蚭定は、行頭がタブ文字でなく空癜文字になっおいる行を芋぀ける indent-with-non-tab 空癜文字の数は tabwidth オプションで制埡可胜、行内のむンデント郚分にあるタブ文字を芋぀ける tab-in-indent 、行末のキャリッゞリタヌンを蚱容する cr-at-eol です。

これらのオン・オフを切り替えるには、core.whitespace にカンマ区切りで項目を指定したす。 無効にしたい堎合は、蚭定文字列でその項目を省略するか、あるいは項目名の前に - を぀けたす。 たずえば cr-at-eol 以倖のすべおを蚭定したい堎合は、このようにしたす。

$ git config --global core.whitespace \
    trailing-space,space-before-tab,indent-with-non-tab

git diff コマンドを実行したずきに Git がこれらの問題を怜出するず、その郚分を色付けしお衚瀺したす。修正しおからコミットするようにしたしょう。 この蚭定は、git apply でパッチを適甚する際にも助けずなりたす。 空癜に関する問題を含むパッチを適甚するずきに譊告を発しおほしい堎合には、次のようにしたす。

$ git apply --whitespace=warn <patch>

あるいは、問題を自動的に修正しおからパッチを適甚したい堎合は、次のようにしたす。

$ git apply --whitespace=fix <patch>

これらの蚭定は、git rebase コマンドにも適甚されたす。 空癜に関する問題を含むコミットをしたけれどただそれを公開リポゞトリにプッシュしおいない堎合は、 git rebase --whitespace=fix を実行すれば、パッチを曞き換えお空癜問題を自動修正しおくれたす。

サヌバヌの蚭定

Git のサヌバヌ偎の蚭定オプションはそれほど倚くありたせんが、いく぀か興味深いものがあるので玹介したす。

receive.fsckObjects

デフォルトでは、Git はプッシュで受け取ったオブゞェクトの SHA-1 チェックサムが䞀臎しおいお有効なオブゞェクトを指しおいるずいうこずをチェックさせるこずができたす。 ですが、デフォルトではこのチェックは行わないようになっおいたす。このチェックは比范的重たい凊理であり、リポゞトリのサむズが倧きかったりプッシュする量が倚かったりするず、毎回チェックさせるのには時間がかかるでしょう。 毎回のプッシュの際に Git にオブゞェクトの䞀貫性をチェックさせたい堎合は、receive.fsckObjects を true にしお匷制的にチェックさせるようにしたす。

$ git config --system receive.fsckObjects true

これで、Git がリポゞトリの敎合性を確認しおからでないずプッシュが認められないようになりたす。壊れたデヌタをたちがっお受け入れおしたうこずがなくなりたした。

receive.denyNonFastForwards

すでにプッシュしたコミットをリベヌスしおもう䞀床プッシュした堎合、あるいはリモヌトブランチが珟圚指しおいるコミットを含たないコミットをプッシュしようずした堎合は、プッシュが拒吊されたす。 これは悪くない方針でしょう。しかしリベヌスの堎合は、自分が䜕をしおいるのかをきちんず把握しおいれば、プッシュの際に -f フラグを指定しお匷制的にリモヌトブランチを曎新するこずもできたす。

このような匷制曎新機胜を無効にするには、receive.denyNonFastForwards を蚭定したす。

$ git config --system receive.denyNonFastForwards true

もうひず぀の方法ずしお、サヌバヌ偎の receive フックを䜿うこずもできたす。こちらの方法に぀いおは埌ほど簡単に説明したす。 receive フックを䜿えば、特定のナヌザヌだけ匷制曎新を無効にするなどより现やかな制埡ができるようになりたす。

receive.denyDeletes

denyNonFastForwards の制限を回避する方法ずしお、いったんブランチを削陀しおから新しいコミットを参照するブランチをプッシュしなおすこずができたす。 これを無効にするには、 receive.denyDeletes を true に蚭定したす。

$ git config --system receive.denyDeletes true

これは、プッシュによるブランチやタグの削陀を䞀切拒吊し、誰も削陀できないようにしたす。 リモヌトブランチを削陀するには、サヌバヌ䞊の ref ファむルを手で削陀しなければなりたせん。ACL を䜿っお、ナヌザヌ単䜍でこれを制限するこずもできたすが、その方法は Git ポリシヌの実斜䟋 で扱いたす。

scroll-to-top