gitattributes手冊

gitattributes(5) Manual Page

1.gitattributes是什麼?html

gitattributes用於定義每一個路徑的屬性。git

其語法是:pattern attr1 attr2 ...github

2.什麼叫作定義每一個路徑的屬性?安全

好比:(pattern attr1)  *.txt textapp

*.txt就是一個pattern,用來匹配全部的.txt文件,匹配到的各個文件就有各自的路徑。spa

好比text屬性,text就是一個屬性名,它的值是true。版本控制

3.pattern後面能夠接多個屬性,又是怎麼給屬性賦值的呢?orm

每種屬性可能有Set,Unset,Set to a value,Unspecified幾種狀態。htm

Set狀態就是 其值是true,單獨寫出這個屬性名就表示其值是true。ci

Unset狀態就是 其值是false,屬性名加上-就表示其值是false。

Set to a value狀態就是 屬性名=值,值就是一個字符串

Unspecified狀態 就是pattern沒有匹配到路徑,以及沒有說明路徑有仍是沒有屬性。

舉個例子,text屬性

Set狀態 text

Unset狀態 -text

Set to a value狀態 text=auto

4.在哪些地方能夠寫gitattributes呢?

①. $GIT_DIR/info/attributes 文件中 (優先級高)

②. 各個文件路徑所在目錄下的.gitattributes文件,以及全部父目錄下的.gitattributes文件(優先級中,距離越遠優先級越低)

③. 全局及系統範圍下的文件(優先級低)

5.各個位置的gitattributes分別用於什麼目的呢?

若是隻想影響一個用戶的某一個repository,就放在$GIT_DIR/info/attributes中。由於這個文件是repository所獨有的,是不會放到版本控制中的,於是別的repository訪問不到。

對於全部用戶都感興趣的gitattributes就放到.gitattributes文件中。由於這些文件會放到版本控制中,分發給其餘的repository。

對於影響一個用戶的全部repository的屬性就放到由core.attributesfile配置選項指定的文件中。

針對一個系統中的全部用戶的屬性應該放到$(prefix)/etc/gitattributes文件中。

6.gitattributes中的屬性對Git有什麼影響呢?

對於遷入或遷出的影響

遷入就是將working tree中你準備的內容保存到repository中,好比git add,git commit命令。

遷出就是將保存在repository中的內容拷貝到working tree中,好比git checkout,git merge命令。

text屬性

給一個路徑設置text屬性能夠啓用和控制end-of-line的規範化。當一個文本文件被規範化時,在repository中它的行結束符會被轉換爲LF。

要控制在working directory中使用的行結束符,就要爲單個文件使用eol屬性以及爲全部文本文件使用core.eol配置

①.Set狀態 在路徑中設置text屬性爲Set狀態會啓用end-of-line的規範化並將這個路徑標記爲文本文件。不須要猜想內容類型,End-of-line轉換就會發生。

②.Unset狀態 在路徑中設置text屬性爲Unset狀態就是告訴git在遷入遷出時不嘗試任何的end-of-line轉換。

③.Set to string value "auto" 狀態 設置text屬性爲「auto」狀態時, 路徑就標記爲自動end-of-line規範化。若是git肯定內容是文本,在遷入時,行結束符就被規範化爲LF。

④.Unspecified狀態 若是text屬性沒有被指定,git使用core.autocrlf配置變量來決定這個文件是否應該被轉換。

任何其餘值都會使得git的行爲和text屬性設置爲Unspecified狀態時同樣。

eol屬性

這個屬性用於設定在working directory中使用的行結束符。它會動用end-of-line規範化而不作任何的內容檢查,高效地設置text屬性。

①.Set to string value "crlf" 狀態  這個設置會強制git在遷入文件時規範化行結束符,而且當文件遷出時,將它們轉爲CRLF。

②.Set to string value "lf" 狀態  這個設置會強制git在遷入文件時規範化行結束符爲LF,而且當文件遷出時,阻止轉換爲CRLF。

 

crlf屬性的向後兼容性

爲了向後兼容,crlf屬性按以下方式解讀:

crlf            text
-crlf           -text
crlf=input      eol=lf

End-of-line轉換

雖然git一般只保留文件內容,可是它能夠被配置來規範化在repository中的行結束符爲LF,能夠選擇在文件遷出時將它們轉換爲CRLF

這是一個讓git規範化.txt,.vcproj,.sh文件的例子,確保在working directory中,.vcproj文件有CRLF,.sh文件有LF,而且無論.jpg文件的內容阻止其被規範化。

*.txt           text
*.vcproj        eol=crlf
*.sh            eol=lf
*.jpg           -text

其餘的源代碼管理系統規範化在repository中的全部文本文件,而且在git中有兩種啓用相似的自動規範化的方式。

若是你只是想在你的working directory中用CRLF行結束符而無論你的repository,你能夠設置config變量「core.autocrlf」而不用改變任何屬性。

[core]

    autocrlf = true

這不會強制全部文本文件的規範化,可是確實會保證你引入到repository中的文本文件的行結束符,在被加入時規範化爲LF,確保在repository中已經規範化的文件保持規範化。

若是你想和強制end-of-line規範化的源代碼管理系統進行互操做,或你只是想要在你的repository中的全部文本文件被規範化,你應當爲全部文件設置text屬性爲「auto」。

*   text=auto

這會保證全部git認爲是文本的文件在repository中規範化(LF)。core.eol配置變量控制在你的working directory中git會使用的行結束符;默認是使用你的平臺的本地行結束符。若是core.autocrlf設置了就是CRLF。

注意

當在一個既存的repository中啓用text=auto時,任何包含CRLFs的文本文件應當被規範化。若是它們沒有被規範化的話,在下一次某我的變動了它們的話,會形成不幸的錯誤認定。

從一個乾淨的工做目錄開始:

$ echo "* text=auto" >>.gitattributes
$ rm .git/index     # Remove the index to force git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

對於任何不該該被規範化的文件出如今git status中的話,在運行git add -u以前設置text屬性爲unset狀態。

manual.pdf      -text

相反,git未檢測到的文本文件能夠手動啓用規範化。

weirdchars.txt  text

若是core.safecrlf被設爲「true」或「warn」,git會驗證這個轉換對於當前的core.autocrlf設置是不是可逆的。對於「true」,git拒毫不可逆轉的轉換。對於「warn」,git只是打印一個警告,但接受不可逆的轉換。
安全觸發器阻止對work tree中的文件執行這種轉換,但有一些例外。 即便…
・ git add・・・

・ git apply・・・

・ git diff ・・・

相關文章
相關標籤/搜索