8.1 配置 Git

2018-02-24 15:22 更新

配置 Git

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

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

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

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

接下來 Git 會查找每個用戶的?~/.gitconfig?文件(或者?~/.config/git/config?文件)。 你可以傳遞?--global?選項讓 Git 讀寫該文件。

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

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

NOTE

Git 的配置文件是純文本的,所以你可以直接手動編輯這些配置文件,輸入合乎語法的值。 但是運行?git config?命令會更簡單些。

客戶端基本配置

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

$ man git-config

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

core.editor

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

$ git config --global core.editor emacs

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

commit.template

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

subject line

what happened

[ticket: X]

要想讓 Git 把它作為運行?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

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

core.pager

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

$ git config --global core.pager ''

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

user.signingkey

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

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

現(xiàn)在,你每次運行?git tag?命令時,即可直接簽署標簽,而無需定義密鑰:

$ git tag -s <tag-name>

core.excludesfile

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

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

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

*~
.DS_Store

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

help.autocorrect

假如你打錯了一條命令,會顯示:

$ git chekcout master
git:'chekcout' 不是一個 git 命令。參見 'git --help'。

您指的是這個么?
  checkout

Git 會嘗試猜測你的意圖,但是它不會越俎代庖。 如果你把?help.autocorrect?設置成 1,那么只要有一個命令被模糊匹配到了,Git 會自動運行該命令。

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

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

Git 中的著色

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

color.ui

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

$ git config --global color.ui false

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

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

color.*

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

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

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

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

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

外部的合并與比較工具

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

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

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

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

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

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

由于你僅僅需要?old-file?和?new-file?參數(shù),由包裝 diff 的腳本來轉(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)在你可以修改配置文件來使用你自定義的合并和比較工具了。 這將涉及許多自定義設置:merge.tool?通知 Git 該使用哪個合并工具,?mergetool.<tool>.cmd?規(guī)定命令運行的方式,mergetool.<tool>.trustExitCode?會通知 Git 程序的返回值是否表示合并操作成功,diff.external?通知 Git 該用什么命令做比較。 因此,你可以運行以下四條配置命令:

$ 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,而不是在命令行輸出比較的結(jié)果,就像這樣:

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號