1、忽略檔案常遇到的問題
有些時候,你想新增一個檔案到Git,但發現新增不了,原因可能是這個檔案被.gitignore
忽略了:
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
如果你確實想新增該檔案,可以用-f
引數強制新增到Git本地版本庫:
關於-f
引數,描述如下:
-f, --force
:Allow adding otherwise ignored files.
允許新增被忽略的檔案。
$ git add -f App.class
或者你發現,可能是.gitignore
寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore
命令檢查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git會告訴我們,.gitignore
的第3行規則忽略了該檔案,於是我們就可以知道應該修訂哪個規則。
還有些時候,當我們編寫了規則排除了部分檔案時:
# 排除所有.開頭的隱藏檔案:
.*
# 排除所有.class檔案:
*.class
但是我們發現.*
這個規則把.gitignore
也排除了,並且App.class
需要被新增到版本庫,但是被*.class
規則排除了。
雖然可以用git add -f
強制新增進去,但有強迫症的童鞋還是希望不要破壞.gitignore
規則,這個時候,可以新增兩條例外規則:
# 排除所有.開頭的隱藏檔案:
.*
# 排除所有.class檔案:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
把指定檔案排除在.gitignore
規則外的寫法就是!
+檔名,所以,只需把例外檔案新增進去即可。
小結
- 忽略某些檔案時,需要編寫
.gitignore
檔案。 .gitignore
檔案本身要放到版本庫裡,並且可以對.gitignore
做版本管理。- 可以不提交到本地版本庫或遠端倉庫,只對本地副本有效。
- 可以提交到遠端倉庫,對所有
clone
下來的版本庫生效。(所以個人特殊忽略不要在這裡新增)
2、忽略檔案配置優先順序
Git檢查忽略規則的時候有多個來源,它的優先順序如下(由高到低):
- 從命令列中讀取可用的忽略規則。
- 當前目錄定義的規則(
.gitingore
檔案)。 - 父級目錄定義的規則,依次遞推,目錄結構較高的
.gitignore
檔案將被較近的.gitignore
檔案中相同的配置所覆蓋(.gitingore
檔案)。 .git/info/exclude
檔案中定義的規則。core.excludesfile
中定義的全域性規則。
3、忽略已跟蹤檔案的改動(本機使用)
(1)需求說明
之前的忽略方案,都是適用於未跟蹤檔案的忽略,而對於已跟蹤(track
)檔案的改動並不適用,好在針對這種情況,Git也提供了我們方法去忽略。
換句話說,就是新增忽略之後,修改已經提交到版本庫中的檔案是無法忽略的。
即:
.gitignore
只能忽略那些原來沒有被track
的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore
是無效的。
(2)處理步驟
自己思考的方式:(稀爛哈哈)
- 將專案
clone
到本地。 - 刪除專案中的忽略配置,如:根目錄中的
.gitignore
檔案。 - 然後在建立新的
.gitignore
檔案,重新配置忽略。
正確的做法:
clone
下來的倉庫中手動設定,不要檢查特定檔案的更改情況。
執行命令如下:
這樣已經在本地版本庫中的檔案修改之後,也可以被忽略。# 忽略跟蹤(提交程式碼時,忽略某一個檔案不提交,即某個檔案不被版本控制) # file-path是目標檔案路徑 git update-index --assume-unchanged file-path # 恢復跟蹤 git update-index --no-assume-unchanged file-path
不過如果執行git checkout
(切換分支)和git reset
(回退版本)命令的時候仍然會影響到這些檔案,並把內容恢復到被跟蹤的內容(再次執行上面命令,修改仍然不會被跟蹤)。- 另一種方式:
Git還提供了另一種exclude
的方式來做同樣的事情,就是之前說過的在本地版本庫中的.git/info/exclude
檔案中配置忽略,這裡設定的忽略規則是你自己本地需要排除的檔案, 他不會影響到其他人,也不會提交到版本庫中去。
4、autocrlf和safecrlf引數說明
(1)提出問題
我們在配置全域性忽略.gitconfig
檔案的時候,可能會看到如下配置:
[core]
autocrlf = true
safecrlf = false
excludesfile = C:/Users/L/gitignore_global.txt
那麼autocrlf = true
和safecrlf = false
是什麼意思?
LF
是Linux系統下的換行符,而CRLF
是Windows系統下的換行符。由於我們的檔案建立於Linux系統下(Git Bash中建立),而儲存中Windows系統中,所以檔案中的行結束符,要使用Windows下的CRLF
格式換行,而在Git中的預設配置是自動轉換。
因為在Git的忽略檔案中,是一行一行的忽略規則,而autocrlf
和safecrlf
就是對轉變換行格式的具體配置。
(2)autocrlf說明
autocrlf = true
:表示要求Git在提交時將CRLF
轉換為LF
,而在檢出時將LF
轉換為CRLF
。autocrlf = false
:在提交與檢出程式碼的時候均不對換行符進行轉換。autocrlf = input
:表示在提交時將CRLF
轉換為LF
,而檢出時不轉換。
以上可手動配置在.gitconfig
檔案中,
使用命令列配置如下:
# 提交時轉換為LF,檢出時轉換為CRLF
git config --global core.autocrlf true
# 提交時轉換為LF,檢出時不轉換
git config --global core.autocrlf input
# 提交檢出均不轉換換行格式
git config --global core.autocrlf false
提示:當
git add
遇到fatal: LF would be replaced by CRLF
或者fatal: CRLF would be replaced by LF
的錯誤時,我們就需要考慮autocrlf
引數的配置了。
建議:
Windows:(true)
提交時,將
CRLF
轉成LF
再提交。切出時,自動將
LF
轉為CRLF
。MAC/Linux: (input)
提交時, 將
CRLF
轉成LF
再提交。切出時,保持
LF
即可。
這樣即可保證倉庫中永遠都是LF
, 而且在Windows工作空間都是CRLF
,在Mac/Linux工作空間都是LF
。
(3)safecrlf說明
autocrlf = ture
:拒絕提交包含混合換行符的檔案。autocrlf = false
:允許提交包含混合換行符的檔案。autocrlf = warn
:提交包含混合換行符的檔案時給出警告。
以上可手動配置在.gitconfig
檔案中,
使用命令列配置如下:
# 拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true
# 允許提交包含混合換行符的檔案
git config --global core.safecrlf false
# 提交包含混合換行符的檔案時給出警告
git config --global core.safecrlf warn
參考: