git命令行(4)其餘

一.忽略文件

1.文件分類

git將全部文件分紅三類:已追蹤的、被忽略的以及未追蹤的。git

  • 已追蹤的:表示已經存在版本庫中的,或者以暫存到暫存區的
  • 被忽略的:在忽略文件中配置的忽略文件
  • 位追蹤的:出去上面的兩類,例如新增的工做區的文件

2. gitignore文件

能夠在gitignore中配置忽略文件,其格式以下:shell

  • 空行被忽略,使用#號做爲註釋
  • 簡單的字面文件名匹配文件夾 例如target能夠匹配target目錄
  • 以/結尾能夠忽略整個目錄下的全部文件,例如target/ bin/能夠忽略構建的文件
  • 能夠包含shell通配符,如星號(*) 例如*.log忽略全部的log文件
  • 起始的感嘆號會對其他部分的模式取反

因爲gitignore文件能夠在不少地方配置,所以其有優先級,優先級由高到低以下:windows

    • 命令行上指定的模式
    • 在相同目錄的.gitignore文件
    • 上層目錄中的模式,最接近當前目錄的上層模式的優先級高於更上層的模式
    • 來自.git/info/exclude文件的模式
    • 來自配置變量core.excludefile指定文件中的模式

通常開發中,都會在代碼庫的工做區跟目錄指定.gitignore文件bash

2、補丁

對於有些網絡不通獲取其餘狀況,須要使用補丁來合併代碼。git提供了三個特定命令來幫助交換補丁服務器

1.format-patch

format-patch命令會以郵件消息的形式生成一個補丁,每一個提交都是一個相對於上個提交的補丁文件。用法以下:網絡

git format-patch -2 -------------最近的兩次提交,生成兩個補丁文件
git format-patch master~4..master~2  -----特定的範圍

2.郵遞補丁

補丁文件生成好之後須要發送補丁文件,你能夠直接經過我的郵箱以附件的形式發送,不過git提供了send-email命令來直接發送補丁文件。例如:
git send-email -to my@example.com 0001-A.patch
可是你須要配置你的郵箱的SMTP服務器的地址和端口號才行:
git config --global sendemail.smtpserver smtp.my-isp.com
git config --global sendemail.smtpserverport 465 編輯器

能夠經過查詢郵箱的smtp服務器來配置,通常在郵箱的設置選項裏面能夠看到smtp服務器地址,例如網易的免費郵以下:ide

郵箱 POP3 服務器(端口110) SMTP 服務器(端口25)
188.com pop3.188.com smtp.188.com
163.com pop3.163.com smtp.163.com
126.com pop3.126.com smtp.126.com
netease.com pop.netease.com smtp.netease.com
yeah.net pop.yeah.net smtp.yeah.net

3.應用補丁

可使用git am命令來應用補丁,
git am /temp/0001-B.patch工具

3、鉤子

當git出現版本庫如提交或者推送事件的時候,會觸發鉤子(特定的腳本),鉤子中能夠處理其餘的一些事情,例如觸發CI構建,或者決定事件是否有效,例如提交的日誌不符合必定的格式,不能提交。
git的鉤子只屬於特定的版本庫,在clone操做的時候並不能複製。也就是每一個開發人員都須要設置經過複製文件的形式把鉤子腳本copy到.git/hooks目錄
通常鉤子分紅兩種:post

  • 前置鉤子(pre):這種鉤子會在動做完成前調用,例如提交前經過非零狀態退出,那麼就會拒絕該事件
  • 後置鉤子(post):會在動做完成前調用,經常使用來出發通知(郵件、CI),一般其退出狀態會忽略。

在.git/hooks目錄下,預製了不少鉤子樣例文件,直接把相應文件的.sample後綴去除就是一個鉤子文件。提交鉤子的流程以下:

pre-commit hook -----------------可使用--no-verify屏蔽,這個鉤子腳本調用的時候沒有入參,所以只能經過git diff --cache命令來得到提交的內容,而後進行判斷
 |
V
commit-msg hook -------------可使用--no-verify屏蔽,這個鉤子腳本只有一個參數,即.git/COMMIT_EDITMSG文件的路徑位置。用戶能夠經過讀取這個文件來對提交的日誌進行一些校驗
 |
V
actully do the commit
 |
V
post-commit hook --------------沒有入參

可使用git help hooks命令來查看當前版本支持的鉤子。

4、git管理命令

1.打包文件

經過git 的對象能夠知道,每次提交存儲的都是一個完整的內容,而不是和上次提交的差別。這樣若是對應比較大的文件,而每次提交對該文件作了小小的改動,會致使對象庫裏面存儲效率很低。
爲了解決這種存儲效率低的問題,git提供了一種打包文件,git首先定位內容很是類似的所有文件,而後爲他們之一存儲整個文件內容,以後計算類似文件之間的差別而且只存儲差別。
打包文件在.git\objects\pack目錄下面。

2.GC

git對象庫中可能存在大量的未引用的文件,例如git reset命令、git filter-branch命令。若是版本庫中有不少的鬆散對象,執行git reflog expire命令是,都會觸發git gc或者手動觸發gc命令,那麼就會清理對象庫中的文件

3.filter-branch

filter-branch命令是一個比較重量級的命令,能夠經過自定義的命令來利用它操做不一樣的git對象,從而重寫分支上的提交。
其具體應用以下:
一、修改author和committer,當咱們想把代碼庫公開的時候,可是想替換每一個提交的做者和郵箱地址,那麼可使用以下的命令:

$ git filter-branch --commit-filter '
        if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
        then
                GIT_AUTHOR_NAME="Scott Chacon";
                GIT_AUTHOR_EMAIL="schacon@example.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

二、每個提交移除一個文件
這常常發生。 有人粗心地經過 git add . 提交了一個巨大的二進制文件,你想要從全部地方刪除它。 可能偶然地提交了一個包括一個密碼的文件,然而你想要開源項目。 filter-branch 是一個可能會用來擦洗整個提交歷史的工具。 爲了從整個提交歷史中移除一個叫作 passwords.txt 的文件,可使用 --tree-filter 選項給 filter-branch:

$ git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

Rewrite 6b9b3cf04e7c5686a9cb838c3f36a8cb6a0fc2bd (21/21)
Ref 'refs/heads/master' was rewritten
--tree-filter 選項在檢出項目的每個提交後運行指定的命令而後從新提交結果。 在本例中,你從每個快照中移除了一個叫做 passwords.txt 的文件,不管它是否存在。 若是想要移除全部偶然提交的編輯器備份文件,能夠運行相似 git filter-branch --tree-filter 'rm -f *~' HEAD 的命令。

最後將能夠看到 Git 重寫樹與提交而後移動分支指針。 一般一個好的想法是在一個測試分支中作這件事,而後當你決定最終結果是真正想要的,能夠硬重置 master 分支。 爲了讓 filter-branch 在全部分支上運行,能夠給命令傳遞 --all 選項。

4.具體問題

1.版本庫合併

對於代碼庫合併可使用以下的步驟:

一、git remote add anoterURL ------------使用git remote命令添加其餘倉庫的url
二、git pull anoternURL     --allow-unrelated-histories    ------------使用git pull命令拉取其餘倉庫的代碼,注意要使用--allow-unrelated-histories

而若是須要把其餘的代碼庫檢查到當前代碼庫的某個子目錄,須要使用協同模型---子樹合併的方式,請參考後續的博客。

2.windows下載代碼路徑超過256字符

在windows下常用git clone命令或者checkout命令的時候,因爲須要檢查的代碼路徑超過了256致使失敗,這時能夠增長core.longpaths配置來解決。例如:git config core.longpaths true 若是該配置設置之後仍然不能生效,那麼須要檢查一下你的git版本是否太低,把git升級到新版本就能夠了,由於這個參數配置也是須要git高版本才能生效。

相關文章
相關標籤/搜索