一、前言
我們以Android項(xiàng)目為例子,在新建項(xiàng)目的時(shí)候我們提交項(xiàng)目到倉(cāng)庫(kù)之前,會(huì)有一個(gè).gitignore文件用于過(guò)濾文件或者文件夾,本人強(qiáng)烈建議在第一次新建的時(shí)候把該考慮到的都考慮進(jìn)去,以免后期團(tuán)隊(duì)協(xié)作開(kāi)發(fā)的時(shí)候引起不必要的麻煩,畢竟,時(shí)間就是金錢(qián),哪怕是幾分鐘的事兒。
不過(guò),很多朋友可能是中途接手項(xiàng)目,項(xiàng)目中的忽略文件不合理,此時(shí)此刻,我們第一會(huì)想到去修改.gitignore文件去忽略提交倉(cāng)庫(kù)的文件,但是發(fā)現(xiàn)修改完成后,目標(biāo)文件還是能夠提交的。
所以,我們應(yīng)該怎樣做呢?
二、解決辦法
1.首先,我們要清楚,為什么我們?cè)谔峤粋}(cāng)庫(kù)之后修改了.gitignore去忽略目標(biāo)文件不起作用?
原因:.gitignore只能忽略掉那些原來(lái)沒(méi)有被追蹤(track)的文件,所以如果有一些文件提交到了git倉(cāng)庫(kù)當(dāng)中,接受了git追蹤,那么直接修改.gitignore是無(wú)效的。所以建議在第一次提交項(xiàng)目時(shí)候,把該考慮到的考慮全。
2.忽略已提交的文件也有很多種不同情況,下面我說(shuō)說(shuō)常見(jiàn)的幾種:
-
例如說(shuō),有些文件已經(jīng)被提交,但是后期做項(xiàng)目的過(guò)程中,我們想要忽略這些文件的跟蹤。這些文件在本地磁盤(pán)中還想保留著(簡(jiǎn)單說(shuō)就是倉(cāng)庫(kù)上不會(huì)存在被忽略的文件,但是本地項(xiàng)目存在這些文件)
應(yīng)用場(chǎng)景如下:過(guò)濾gradle-wrapper.properties本地配置
這里我們是在本地配置gradle的distributionUrl,由于每臺(tái)電腦的gradle路徑都不一樣(如果電腦名不一樣),所以需要忽略掉此文件,并且本地是要保留的。這里 我直接把wrapper整個(gè)文件夾直接過(guò)濾掉。
操作如下:
git rm --cached -r gradle/wrapper
然后修改項(xiàng)目.gitignore文件添加過(guò)濾規(guī)則:gradle/wrapper
然后commit
最后push 還有種情況,在我們已經(jīng)提交過(guò)的一些文件中,在后期由于種種原因發(fā)現(xiàn)不需要某個(gè)文件,我們想這些文件被徹底刪除時(shí)候。
操作如下:
git rm somefiles 從本地移除這個(gè)文件,并且刪除本地緩存
更新gitignore文件,忽略目標(biāo)文件(somefiles)
然后commit
最后push
三、總結(jié)
1.下面我說(shuō)說(shuō)rm命令系列的作用和用法與區(qū)別:
- rm
單純的刪除本地文件,與git沒(méi)有任何關(guān)系,所以git上是不會(huì)有該刪除記錄的 - git rm
刪除git追蹤文件,并刪除本地文件,git上會(huì)保存此次刪除記錄 - git rm --cached -r
單單刪除git追蹤文件,不刪除本地文件
2.為什么增加了.gitignore里的規(guī)則卻沒(méi)有效果?
- 我在文章開(kāi)始也簡(jiǎn)單提到了,那是因?yàn)?gitignore文件只能作用于未跟蹤的文件(Untracked Files),也就是從來(lái)沒(méi)有被Git記錄過(guò)的文件。所以要先從Git索引中刪除對(duì)改文件的追蹤,才能使.gitignore文件生效。而刪除文件的追蹤是git rm,這種做法會(huì)將本地的物理文件一并刪除。如果想要?jiǎng)h除追蹤狀態(tài)而非物理文件,可以使用git rm --cached。
