之間「文件從未在檢查並.gitignored」區別與「文件被簽入,但隨後RM-ED並一直尋找的gitignore模板的集合。 gitignored「比你推斷的要少。 如果從未添加該文件並將其放入.gitignore會按預期工作,然後刪除該文件,您可以將它放入.gitignore中,在可能一輪的困難之後,它應該開始工作。
(這將是情況下,例如,如果使用git pull
更新服務器的拉提交該刪除的文件可能會刪除文件 - 儘管它應該顯示爲衝突。但隨後的拉取會忽略該文件,特別是如果你已經將它添加到.gitignore。但我離題了,我已經在評論中掩蓋了我的困惑......)
所以問題是如何從歷史中刪除文件,就好像它從未被添加過,雖然我懷疑它會幫助,這裏是你如何做到這一點:
你必須「重寫」引入文件的提交(或提交),以及任何落後於此提交的提交。如果這是一個共享存儲庫,那麼在重寫之後,每個人都必須轉換到重寫 - 最簡單的辦法是讓所有人都放棄其當前的repo並重新克隆。這意味着你必須協調一個「不變」窗口;如果有人在該窗口開始處的截止後做出改變,則需要將其重新編入重寫的樹中。
現在,如果最近添加了文件,並且在引入它的提交之後沒有很多歷史記錄,那麼這可能是一個相對簡單的過程,您甚至可以使用一些快捷方式。但一般解決方案是使用git filter-branch
或BFG存儲庫清潔器。
這兩者中,BFG更簡單快捷(因爲這是它專門設計用於解決的任務之一)。它的作者認爲唯一安全的過程是手動從當前提交中移除文件,測試當前提交中的所有內容都按預期工作,然後使用BFG清理歷史記錄。我認爲這過於迂腐,並向他解釋了爲什麼,但他堅持了下來;所以你必須做出自己的想法。
如果您選擇使用filter-branch
您可以使用索引過濾器;它是git過濾器文檔中的庫存示例之一,所以我只是在那裏查找它。
你是如何部署的?既然你只提到git,我推斷你用git pull來部署;但這不應該像你所描述的那樣。刪除文件*的提交的pull *可能會刪除該文件(儘管如果本地文件與git中的最後一個版本不匹配,它應該顯示爲衝突);但在此之後,一旦文件恢復到位,後續的提交(與文件無關的提交)應該不會影響文件。除非你有.gitignore它,否則該文件應該顯示爲「untracked」。這就是說... –
...因爲你描述的行爲與git應該做的不同,我懷疑你正在使用其他方法來部署。但是,如果您*正在使用某種其他方法進行部署,那麼文件曾經在git中的事實在部署過程中完全沒有影響。儘管如此,我會提供一個解決問題的答案;但我認爲這一點的澄清是有用的。 –
@MarkAdelsberger是對的:Git將只刪除'git checkout'上的文件,該文件將您從配置文件位於索引和工作樹中的情況帶到配置文件所在的位置*不存在。然而,每次你移動到一個提交的文件,然後回到那個*沒有的文件,Git會替換並移除該文件(只要它允許,或者因爲index + work沒有改變樹,或者因爲你使用了'--force')。因此,「你如何部署」是一個至關重要的問題。 – torek