gitattributes手册
gitattributes(5) Manual Page
1.gitattributes是什么?
gitattributes用于定義每個路徑的屬性。
其語法是:pattern attr1 attr2 ...
2.什么叫做定義每個路徑的屬性?
比如:(pattern attr1)? *.txt text
*.txt就是一個pattern,用來匹配所有的.txt文件,匹配到的各個文件就有各自的路徑。
比如text屬性,text就是一個屬性名,它的值是true。
3.pattern后面可以接多個屬性,又是怎么給屬性賦值的呢?
每種屬性可能有Set,Unset,Set to a value,Unspecified幾種狀態。
Set狀態就是 其值是true,單獨寫出這個屬性名就表示其值是true。
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=lfEnd-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 ???
?
轉載于:https://www.cnblogs.com/niaomingjian/p/8446819.html
總結
以上是生活随笔為你收集整理的gitattributes手册的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风险分解结构
- 下一篇: C++ STL vector(向量)