自定義git

自定義git

1. git配置

使用git config –help查看幫助文檔。


1.1 客戶端配置

core.editor Git默認文本編輯器
commit.template 默認提交模板
core.pager 默認分頁器
user.signingkey GPG簽署密鑰
core.excludesfile 項目庫之外的定義那些需被忽略的文件的文件路徑。.gitignore是項目庫內。
help.autocorrect 命令自動修正
color.ui 打開默認終端着色
merge.tool 合併工具配置
diff.externa diff工具
core.autocrlf CRLF轉換LF工具
core.whitespace 空格探測


1.2 服務端端配置

receive.fsckObjects 是否推送期間檢查所有對象的一致性
receive.denyNonFastForwards 禁用強制更新
receive.denyDeletes 禁止刪除分支和標籤


2. git屬性

Git 以對一個特定的子目錄或子文件集運用那些設置項。這些設置項被稱爲 Git 屬性,可以在你目錄中的.gitattributes文件內進行設置(通常是你項目的根目錄)


2.1 二進制文件處理

可以讓 Git 把所有pbxproj文件當成二進制文件,在.gitattributes文件中設置如下:
*.pbxproj binary

你不能直接比較兩個不同版本的Word文件,除非進行手動掃描,Git 屬性能很好地解決此問題,把下面的行加到.gitattributes文件:
*.doc diff=word
還可以同樣的方法對比圖像文件。


2.2 過濾器

你能寫自己的過濾器,在提交文件到暫存區或簽出文件時替換關鍵字。有2種過濾器,「clean」和「smudge」。在 .gitattributes文件中,你能對特定的路徑設置一個過濾器,然後設置處理文件的腳本,這些腳本會在文件簽出前(「smudge」)和提交到暫存區前(「clean」)被調用。
smudge
clean

在.gitattributes文件中設置「indent」過濾器過濾*.c文件:
*.c filter=indent
然後設置過濾器腳本:
git config –global filter.indent.clean indent
git config –global filter.indent.smudge cat


2.3 導出倉庫

Git屬性在導出項目歸檔時也能發揮作用。
當產生一個歸檔時,可以設置 Git 不導出某些文件和目錄。如果你不想在歸檔中包含一個子目錄或文件,但想他們納入項目的版本管理中,你能對應地設置export-ignore屬性。例如:
test/ export-ignore

還能對歸檔做一些簡單的關鍵字替換。
echo ‘Last commit date: F o r m a t : ’ > LAST_COMMIT
echo 「LAST_COMMIT export-subst」 >> .gitattributes


2.4 合併策略

通過 Git 屬性,還能對項目中的特定文件使用不同的合併策略。
可以設置屬性如下:
database.xml merge=ours


3. 掛鉤

當某些重要事件發生時,Git 以調用自定義腳本。有兩組掛鉤:客戶端和服務器端。
掛鉤都被存儲在 Git 目錄下的hooks子目錄中,即大部分項目中的.git/hooks。


3.1 客戶端掛鉤

主要分爲提交工作流掛鉤、電子郵件工作流掛鉤及其他客戶端掛鉤。


3.1.1 提交工作流掛鉤

提交工作流掛鉤主要是以下四個:
pre-commit掛鉤在鍵入提交信息前運行,被用來檢查即將提交的快照。
prepare-commit-msg掛鉤在提交信息編輯器顯示之前,默認信息被創建之後運行。
commit-msg掛鉤接收一個參數,此參數是包含最近提交信息的臨時文件的路徑。如果該掛鉤腳本以非零退出,Git 放棄提交,因此,可以用來在提交通過前驗證項目狀態或提交信息。
post-commit掛鉤在整個提交過程完成後運行,該掛鉤是作爲通知之類使用的。


3.1.2 email工作流掛鉤

有3個可用的客戶端掛鉤用於e-mail工作流。當運行git am命令時,會調用他們。
首先運行applypatch-msg掛鉤,他接收一個參數:包含被建議提交信息的臨時文件名。如果該腳本非零退出,Git 放棄此補丁。可以使用這個腳本確認提交信息是否被正確格式化,或讓腳本編輯信息以達到標準化。

其次,git am運行期間調用是pre-applypatch掛鉤。該掛鉤不接收參數,在補丁被運用之後運行,因此,可以被用來在提交前檢查快照。你能用此腳本運行測試,檢查工作樹。如果有些什麼遺漏,或測試沒通過,腳本會以非零退出,放棄此次git am的運行,補丁不會被提交。

最後,在git am運行期間調用的是post-applypatch掛鉤。你可以用他來通知一個小組或獲取的補丁的作者,但無法阻止打補丁的過程。


3.1.3 其他客戶端掛鉤

pre- rebase掛鉤在衍合前運行,腳本以非零退出可以中止衍合的過程。你可以使用這個掛鉤來禁止衍合已經推送的提交對象。
在git checkout成功運行後,post-checkout掛鉤會被調用。
在merge命令成功執行後,post-merge掛鉤會被調用


3.2 服務端掛鉤

pre-receive在提交對象推送到服務器前被調用。
post-receive 掛鉤在整個過程完結以後運行,可以用來更新其他系統服務或者通知用戶。
update 腳本和 pre-receive 腳本十分類似。假如推送者同時向多個分支推送內容,pre-receive 只運行一次,相比之下update 則會爲每一個更新的分支運行一次。