8.1 配置 Git

2018-02-24 15:22 更新

配置 Git

你在?起步?中看到,可以用?git config?配置 Git。 首先要做的事情就是設(shè)置你的名字和郵件地址:

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

現(xiàn)在,你會(huì)了解到許多更有趣的選項(xiàng),并用類似的方式來(lái)定制 Git。

首先,快速回憶下:Git 使用一系列配置文件來(lái)保存你自定義的行為。 它首先會(huì)查找/etc/gitconfig?文件,該文件含有系統(tǒng)里每位用戶及他們所擁有的倉(cāng)庫(kù)的配置值。 如果你傳遞--system?選項(xiàng)給?git config,它就會(huì)讀寫該文件。

接下來(lái) Git 會(huì)查找每個(gè)用戶的?~/.gitconfig?文件(或者?~/.config/git/config?文件)。 你可以傳遞?--global?選項(xiàng)讓 Git 讀寫該文件。

最后 Git 會(huì)查找你正在操作的版本庫(kù)所對(duì)應(yīng)的 Git 目錄下的配置文件(.git/config)。 這個(gè)文件中的值只對(duì)該版本庫(kù)有效。

以上三個(gè)層次中每層的配置(系統(tǒng)、全局、本地)都會(huì)覆蓋掉上一層次的配置,所以?.git/config中的值會(huì)覆蓋掉?/etc/gitconfig?中所對(duì)應(yīng)的值。

NOTE

Git 的配置文件是純文本的,所以你可以直接手動(dòng)編輯這些配置文件,輸入合乎語(yǔ)法的值。 但是運(yùn)行?git config?命令會(huì)更簡(jiǎn)單些。

客戶端基本配置

Git 能夠識(shí)別的配置項(xiàng)分為兩大類:客戶端和服務(wù)器端。 其中大部分屬于客戶端配置 —— 可以依你個(gè)人的工作偏好進(jìn)行配置。 盡管 Git 支持的選項(xiàng)?繁多,但其中大部分僅僅在某些罕見(jiàn)的情況下有意義。 我們只講述最平常和最有用的選項(xiàng)。 如果想得到你當(dāng)前版本的 Git 支持的選項(xiàng)列表,請(qǐng)運(yùn)行

$ man git-config

這個(gè)命令列出了所有可用的選項(xiàng),以及與之相關(guān)的介紹。 你也可以在??找到同樣的內(nèi)容。

core.editor

默認(rèn)情況下,Git 會(huì)調(diào)用環(huán)境變量($VISUAL?或?$EDITOR)設(shè)置的任意文本編輯器,如果沒(méi)有設(shè)置,會(huì)調(diào)用?vi?來(lái)創(chuàng)建和編輯你的提交以及標(biāo)簽信息。 你可以使用?core.editor?選項(xiàng)來(lái)修改默認(rèn)的編輯器:

$ git config --global core.editor emacs

現(xiàn)在,無(wú)論你定義了什么終端編輯器,Git 都會(huì)調(diào)用 Emacs 編輯信息。

commit.template

如果把此項(xiàng)指定為你的系統(tǒng)上某個(gè)文件的路徑,當(dāng)你提交的時(shí)候, Git 會(huì)使用該文件的內(nèi)容作為提交的默認(rèn)信息。 例如:假設(shè)你創(chuàng)建了一個(gè)叫?~/.gitmessage.txt?的模板文件,類似這樣:

subject line

what happened

[ticket: X]

要想讓 Git 把它作為運(yùn)行?git commit?時(shí)顯示在你的編輯器中的默認(rèn)信息, 如下設(shè)置commit.template

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

然后當(dāng)你提交時(shí),編輯器中就會(huì)顯示如下的提交信息占位符:

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

如果你的團(tuán)隊(duì)對(duì)提交信息有格式要求,可以在系統(tǒng)上創(chuàng)建一個(gè)文件,并配置 Git 把它作為默認(rèn)的模板,這樣可以更加容易地使提交信息遵循格式。

core.pager

該配置項(xiàng)指定 Git 運(yùn)行諸如?log?和?diff?等命令所使用的分頁(yè)器。 你可以把它設(shè)置成用?more或者任何你喜歡的分頁(yè)器(默認(rèn)用的是?less),當(dāng)然也可以設(shè)置成空字符串,關(guān)閉該選項(xiàng):

$ git config --global core.pager ''

這樣不管命令的輸出量多少,Git 都會(huì)在一頁(yè)顯示所有內(nèi)容。

user.signingkey

如果你要?jiǎng)?chuàng)建經(jīng)簽署的含附注的標(biāo)簽(正如?簽署工作?所述),那么把你的 GPG 簽署密鑰設(shè)置為配置項(xiàng)會(huì)更好。 如下設(shè)置你的密鑰 ID:

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

現(xiàn)在,你每次運(yùn)行?git tag?命令時(shí),即可直接簽署標(biāo)簽,而無(wú)需定義密鑰:

$ git tag -s <tag-name>

core.excludesfile

正如?忽略文件?所述,你可以在你的項(xiàng)目的?.gitignore?文件里面規(guī)定無(wú)需納入 Git 管理的文件的模板,這樣它們既不會(huì)出現(xiàn)在未跟蹤列表,也不會(huì)在你運(yùn)行?git add?后被暫存。

不過(guò)有些時(shí)候,你想要在你所有的版本庫(kù)中忽略掉某一類文件。 如果你的操作系統(tǒng)是 OS X,很可能就是指?.DS_Store。 如果你把 Emacs 或 Vim 作為首選的編輯器,你肯定知道以?~?結(jié)尾的臨時(shí)文件。

這個(gè)配置允許你設(shè)置類似于全局生效的?.gitignore?文件。 如果你按照下面的內(nèi)容創(chuàng)建一個(gè)~/.gitignore_global?文件:

*~
.DS_Store

……然后運(yùn)行?git config --global core.excludesfile ~/.gitignore_global,Git 將把那些文件永遠(yuǎn)地拒之門外。

help.autocorrect

假如你打錯(cuò)了一條命令,會(huì)顯示:

$ git chekcout master
git:'chekcout' 不是一個(gè) git 命令。參見(jiàn) 'git --help'。

您指的是這個(gè)么?
  checkout

Git 會(huì)嘗試猜測(cè)你的意圖,但是它不會(huì)越俎代庖。 如果你把?help.autocorrect?設(shè)置成 1,那么只要有一個(gè)命令被模糊匹配到了,Git 會(huì)自動(dòng)運(yùn)行該命令。

$ git chekcout master
警告:您運(yùn)行一個(gè)不存在的 Git 命令 'chekcout'。繼續(xù)執(zhí)行假定您要要運(yùn)行的
是 'checkout'
在 0.1 秒鐘后自動(dòng)運(yùn)行...

注意提示信息中的“0.1 秒”。help.autocorrect?接受一個(gè)代表十分之一秒的整數(shù)。 所以如果你把它設(shè)置為 50, Git 將在自動(dòng)執(zhí)行命令前給你 5 秒的時(shí)間改變主意。

Git 中的著色

Git 充分支持對(duì)終端內(nèi)容著色,對(duì)你憑肉眼簡(jiǎn)單、快速分析命令輸出有很大幫助。 你可以設(shè)置許多的相關(guān)選項(xiàng)來(lái)滿足自己的偏好。

color.ui

Git 會(huì)自動(dòng)著色大部分輸出內(nèi)容,但如果你不喜歡花花綠綠,也可以關(guān)掉。 要想關(guān)掉 Git 的終端顏色輸出,試一下這個(gè):

$ git config --global color.ui false

這個(gè)設(shè)置的默認(rèn)值是?auto,它會(huì)著色直接輸出到終端的內(nèi)容;而當(dāng)內(nèi)容被重定向到一個(gè)管道或文件時(shí),則忽略著色功能。

你也可以設(shè)置成?always,來(lái)忽略掉管道和終端的不同,即在任何情況下著色輸出。 你很少會(huì)這么設(shè)置,在大多數(shù)場(chǎng)合下,如果你想在被重定向的輸出中插入顏色碼,可以傳遞?--color?標(biāo)志給 Git 命令來(lái)強(qiáng)制它這么做。 默認(rèn)設(shè)置就已經(jīng)能滿足大多數(shù)情況下的需求了。

color.*

要想具體到哪些命令輸出需要被著色以及怎樣著色,你需要用到和具體命令有關(guān)的顏色配置選項(xiàng)。 它們都能被置為?truefalse?或?always

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

另外,以上每個(gè)配置項(xiàng)都有子選項(xiàng),它們可以被用來(lái)覆蓋其父設(shè)置,以達(dá)到為輸出的各個(gè)部分著色的目的。 例如,為了讓?diff?的輸出信息以藍(lán)色前景、黑色背景和粗體顯示,你可以運(yùn)行

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

你能設(shè)置的顏色有:normal、black、red、greenyellow、bluemagenta、cyan或?white。 正如以上例子設(shè)置的粗體屬性,想要設(shè)置字體屬性的話,可以選擇包括:bold、dim、ul(下劃線)、blink、reverse(交換前景色和背景色)。

外部的合并與比較工具

雖然 Git 自己內(nèi)置了一個(gè)?diff?實(shí)現(xiàn),而且到目前為止我們一直在使用它,但你能夠用一個(gè)外部的工具替代它。 除此以外,你還能設(shè)置一個(gè)圖形化的工具來(lái)合并和解決沖突,從而不必自己手動(dòng)解決。 這里我們以一個(gè)不錯(cuò)且免費(fèi)的工具 —— Perforce 圖形化合并工具(P4Merge) —— 來(lái)展示如何用一個(gè)外部的工具來(lái)合并和解決沖突。

P4Merge 可以在所有主流平臺(tái)上運(yùn)行,所以安裝上應(yīng)該沒(méi)有什么困難。 在這個(gè)例子中,我們使用的路徑名可以直接應(yīng)用在 Mac 和 Linux 上;在 Windows 上,/usr/local/bin?需要被改為你的環(huán)境中可執(zhí)行文件所在的目錄路徑。

首先, 從??下載 P4Merge。 接下來(lái),你要編寫一個(gè)全局包裝腳本來(lái)運(yùn)行你的命令。 我們會(huì)使用 Mac 上的路徑來(lái)指定該腳本的位置,在其他系統(tǒng)上,它將是?p4merge?二進(jìn)制文件所在的目錄。 創(chuàng)建一個(gè)名為?extMerge?的腳本包裝 merge 命令,讓它把參數(shù)轉(zhuǎn)發(fā)給 p4merge 二進(jìn)制文件:

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

包裝 diff 命令的腳本首先確保傳遞了七個(gè)參數(shù)過(guò)來(lái),隨后把其中兩個(gè)轉(zhuǎn)發(fā)給包裝了 merge 的腳本。 默認(rèn)情況下, Git 傳遞以下參數(shù)給?diff

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

由于你僅僅需要?old-file?和?new-file?參數(shù),由包裝 diff 的腳本來(lái)轉(zhuǎn)發(fā)它們吧。

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

你也需要確保這些腳本具有可執(zhí)行權(quán)限:

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

現(xiàn)在你可以修改配置文件來(lái)使用你自定義的合并和比較工具了。 這將涉及許多自定義設(shè)置:merge.tool?通知 Git 該使用哪個(gè)合并工具,?mergetool.<tool>.cmd?規(guī)定命令運(yùn)行的方式,mergetool.<tool>.trustExitCode?會(huì)通知 Git 程序的返回值是否表示合并操作成功,diff.external?通知 Git 該用什么命令做比較。 因此,你可以運(yùn)行以下四條配置命令:

$ 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

待一切設(shè)置妥當(dāng)后,如果你像這樣運(yùn)行 diff 命令:

$ git diff 32d1776b1^ 32d1776b1

Git 將啟動(dòng) P4Merge,而不是在命令行輸出比較的結(jié)果,就像這樣:

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)