如第一章所言,用git config配置 Git,要做的第一件事就是設(shè)置名字和郵箱地址:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
從現(xiàn)在開始,你會了解到一些類似以上但更為有趣的設(shè)置選項來自定義 Git。
先過一遍第一章中提到的 Git 配置細節(jié)。Git 使用一系列的配置文件來存儲你定義的偏好,它首先會查找/etc/gitconfig文件,該文件含有 對系統(tǒng)上所有用戶及他們所擁有的倉庫都生效的配置值(譯注:gitconfig是全局配置文件), 如果傳遞--system選項給git config命令, Git 會讀寫這個文件。
接下來 Git 會查找每個用戶的~/.gitconfig文件,你能傳遞--global選項讓 Git讀寫該文件。
最后 Git 會查找由用戶定義的各個庫中 Git 目錄下的配置文件(.git/config),該文件中的值只對屬主庫有效。 以上闡述的三層配置從一般到特殊層層推進,如果定義的值有沖突,以后面層中定義的為準,例如:在.git/config和/etc/gitconfig的較量中, .git/config取得了勝利。雖然你也可以直接手動編輯這些配置文件,但是運行g(shù)it config命令將會來得簡單些。
Git 能夠識別的配置項被分為了兩大類:客戶端和服務(wù)器端,其中大部分基于你個人工作偏好,屬于客戶端配置。盡管有數(shù)不盡的選項,但我只闡述 其中經(jīng)常使用或者會對你的工作流產(chǎn)生巨大影響的選項,如果你想觀察你當前的 Git 能識別的選項列表,請運行
$ git config --help
git config
的手冊頁(譯注:以man命令的顯示方式)非常細致地羅列了所有可用的配置項。
Git默認會調(diào)用你的環(huán)境變量editor定義的值作為文本編輯器,如果沒有定義的話,會調(diào)用Vi來創(chuàng)建和編輯提交以及標簽信息, 你可以使用core.editor改變默認編輯器:
$ git config --global core.editor emacs
現(xiàn)在無論你的環(huán)境變量editor被定義成什么,Git 都會調(diào)用Emacs編輯信息。
如果把此項指定為你系統(tǒng)上的一個文件,當你提交的時候, Git 會默認使用該文件定義的內(nèi)容。 例如:你創(chuàng)建了一個模板文件$HOME/.gitmessage.txt
,它看起來像這樣:
subject line
what happened
[ticket: X]
設(shè)置commit.template,
當運行git commit
時, Git 會在你的編輯器中顯示以上的內(nèi)容, 設(shè)置commit.template
如下:
$ git config --global commit.template $HOME/.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
如果你有特定的策略要運用在提交信息上,在系統(tǒng)上創(chuàng)建一個模板文件,設(shè)置 Git 默認使用它,這樣當提交時,你的策略每次都會被運用。
core.pager
指定 Git 運行諸如log、diff等所使用的分頁器,你能設(shè)置成用more或者任何你喜歡的分頁器(默認用的是less), 當然你也可以什么都不用,設(shè)置空字符串:
$ git config --global core.pager ''
這樣不管命令的輸出量多少,都會在一頁顯示所有內(nèi)容。
如果你要創(chuàng)建經(jīng)簽署的含附注的標簽(正如第二章所述),那么把你的GPG簽署密鑰設(shè)置為配置項會更好,設(shè)置密鑰ID如下:
$ git config --global user.signingkey <gpg-key-id>
現(xiàn)在你能夠簽署標簽,從而不必每次運行g(shù)it tag命令時定義密鑰:
$ git tag -s <tag-name>
正如第二章所述,你能在項目庫的.gitignore文件里頭用模式來定義那些無需納入 Git 管理的文件,這樣它們不會出現(xiàn)在未跟蹤列表, 也不會在你運行g(shù)it add后被暫存。然而,如果你想用項目庫之外的文件來定義那些需被忽略的文件的話,用core.excludesfile 通知 Git 該文件所處的位置,文件內(nèi)容和.gitignore類似。
該配置項只在 Git 1.6.1及以上版本有效,假如你在Git 1.6中錯打了一條命令,會顯示:
$ git com
git: 'com' is not a git-command. See 'git --help'.
Did you mean this?
commit
如果你把help.autocorrect設(shè)置成1(譯注:啟動自動修正),那么在只有一個命令被模糊匹配到的情況下,Git 會自動運行該命令。
Git能夠為輸出到你終端的內(nèi)容著色,以便你可以憑直觀進行快速、簡單地分析,有許多選項能供你使用以符合你的偏好。
Git會按照你需要自動為大部分的輸出加上顏色,你能明確地規(guī)定哪些需要著色以及怎樣著色,設(shè)置color.ui為true來打開所有的默認終端著色。
$ git config --global color.ui true
設(shè)置好以后,當輸出到終端時,Git 會為之加上顏色。其他的參數(shù)還有false和always,false
意味著不為輸出著色,而always則表明在任何情況下都要著色,即使 Git 命令被重定向到文件或管道。Git 1.5.5版本引進了此項配置,如果你擁有的版本更老,你必須對顏色有關(guān)選項各自進行詳細地設(shè)置。
你會很少用到color.ui = always,
在大多數(shù)情況下,如果你想在被重定向的輸出中插入顏色碼,你能傳遞--color
標志給 Git
命令來迫使它這么做,color.ui = true應(yīng)該是你的首選。
想要具體到哪些命令輸出需要被著色以及怎樣著色或者 Git 的版本很老,你就要用到和具體命令有關(guān)的顏色配置選項,它們都被置為true、false或always:
color.branch
color.diff
color.interactive
color.status
除此之外,以上每個選項都有子選項,可以被用來覆蓋其父設(shè)置,以達到為輸出的各個部分著色的目的。例如,讓diff輸出的改變信息以粗體、藍色前景和黑色背景的形式顯示:
$ git config --global color.diff.meta "blue black bold"
你能設(shè)置的顏色值如:normal、black、red、green、yellow、blue、magenta、cyan、white,
正如以上例子設(shè)置的粗體屬性,想要設(shè)置字體屬性的話,可以選擇如:bold、dim、ul、blink、reverse。
如果你想配置子選項的話,可以參考git config幫助頁。
雖然 Git 自己實現(xiàn)了diff,而且到目前為止你一直在使用它,但你能夠用一個外部的工具替代它,除此以外,你還能用一個圖形化的工具來合并和解決沖突從而不必自己手動解決。有一個不錯且免費的工具可以被用來做比較和合并工作,它就是P4Merge(譯注:Perforce圖形化合并工具),我會展示它的安裝過程。
P4Merge可以在所有主流平臺上運行,現(xiàn)在開始大膽嘗試吧。對于向你展示的例子,在Mac和Linux系統(tǒng)上,我會使用路徑名,在Windows上,/usr/local/bin應(yīng)該被改為你環(huán)境中的可執(zhí)行路徑。
下載P4Merge:
http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools
首先把你要運行的命令放入外部包裝腳本中,我會使用Mac系統(tǒng)上的路徑來指定該腳本的位置,在其他系統(tǒng)上,它應(yīng)該被放置在二進制文件p4merge所在的目錄中。創(chuàng)建一個merge包裝腳本,名字叫作extMerge,讓它帶參數(shù)調(diào)用p4merge二進制文件:
$ cat /usr/local/bin/extMerge
#!/bin/sh
/Applications/p4merge.app/Contents/MacOS/p4merge $*
diff包裝腳本首先確定傳遞過來7個參數(shù),隨后把其中2個傳遞給merge包裝腳本,默認情況下, Git 傳遞以下參數(shù)給diff:
path old-file old-hex old-mode new-file new-hex new-mode
由于你僅僅需要old-file和new-file參數(shù),用diff包裝腳本來傳遞它們吧。
$ cat /usr/local/bin/extDiff
#!/bin/sh
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
確認這兩個腳本是可執(zhí)行的:
$ sudo chmod +x /usr/local/bin/extMerge
$ sudo chmod +x /usr/local/bin/extDiff
現(xiàn)在來配置使用你自定義的比較和合并工具吧。這需要許多自定義設(shè)置:merge.tool通知 Git 使用哪個合并工具;mergetool.*.cmd
規(guī)定命令運行的方式;mergetool.trustExitCode
會通知 Git 程序的退出是否指示合并操作成功;diff.external
通知 Git 用什么命令做比較。因此,你能運行以下4條配置命令:
$ git config --global merge.tool extMerge
$ git config --global mergetool.extMerge.cmd \
'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'
$ git config --global mergetool.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
設(shè)置完畢后,運行diff命令:
$ git diff 32d1776b1^ 32d1776b1
命令行居然沒有發(fā)現(xiàn)diff命令的輸出,其實,Git 調(diào)用了剛剛設(shè)置的P4Merge,它看起來像圖7-1這樣:
更多建議: