2017-03-15 18 views
1

我在我的項目中有一個配置文件,它是特定於服務器的,因此不希望被包含在Git中,因爲每次部署它時都會覆蓋服務器的設置。爲了解決這個問題,該文件從Git中刪除了......不錯的主意,但現在每次部署項目時,服務器配置文件都會被刪除。如何在不刪除文件的情況下將文件添加到我的.gitignore?

所以我現在陷入了一個問題。我真正想要的是文件在.gitignore,並且永遠不會添加到項目中,但是一旦添加,我就看不到將其從項目中刪除的方法,而不會在每次部署時都觸發對現有文件的刪除。

是否有辦法從項目中刪除文件而不刪除它。有效追溯忽略已添加的文件?

+2

你是如何部署的?既然你只提到git,我推斷你用git pull來部署;但這不應該像你所描述的那樣。刪除文件*的提交的pull *可能會刪除該文件(儘管如果本地文件與git中的最後一個版本不匹配,它應該顯示爲衝突);但在此之後,一旦文件恢復到位,後續的提交(與文件無關的提交)應該不會影響文件。除非你有.gitignore它,否則該文件應該顯示爲「untracked」。這就是說... –

+1

...因爲你描述的行爲與git應該做的不同,我懷疑你正在使用其他方法來部署。但是,如果您*正在使用某種其他方法進行部署,那麼文件曾經在git中的事實在部署過程中完全沒有影響。儘管如此,我會提供一個解決問題的答案;但我認爲這一點的澄清是有用的。 –

+1

@MarkAdelsberger是對的:Git將只刪除'git checkout'上的文件,該文件將您從配置文件位於索引和工作樹中的情況帶到配置文件所在的位置*不存在。然而,每次你移動到一個提交的文件,然後回到那個*沒有的文件,Git會替換並移除該文件(只要它允許,或者因爲index + work沒有改變樹,或者因爲你使用了'--force')。因此,「你如何部署」是一個至關重要的問題。 – torek

回答

0

您可以在.gitignore文件中指定不需要的文件。所以Git會忽略對指定文件的任何修改。

如果您沒有.gitignore文件,您可以簡單地創建它,然後輸入要忽略的文件名。請記住,將文件添加到存儲庫後,您必須提交.gitignore文件。這將指示Git忽略.gitignore文件中指定的文件。

簡而言之,您可以在工作存儲庫中創建一個名爲.gitignore的文件,並在其中列出文件名或模式以匹配 如果我們想忽略所有.sql文件。在.gitignore我們將鍵入以下內容:

*.sql 

如果我們想忽略一個單一的文件,可以說lib/util.php。 然後.gitignore看起來就像這樣:

lib/util.php 

如你願意,你可以指定的.gitignore多個文件名。

gitignore documentation

注意,這將在情況下,僅使用的文件是從來沒有在庫跟蹤開始與@馬克Adelsberger和@torek作爲正確地指出。

+1

如果文件已被追蹤(即,在索引中),將它的路徑放到'.gitignore'中沒有任何作用。你必須使文件* un *被跟蹤,這是OP所做的。問題是,那麼有一個'git checkout'路徑可以讓你得到(跟蹤的,提交的)文件,然後是後續提交的'git checkout',將文件從工作樹*中移除。一旦它不在索引中,除了文件從工作樹上消失之外,一切都可以:它必須從某處(例如它所在的提交)被恢復。 – torek

0

使用git log --oneline打印提交日誌的列表,並啓動git reset 'head'以取消文件的暫存。然後您可以在提交文件之前應用正確的.gitignore模板。 如果你還沒有提交這些文件,你可以使用git rm --cached來取消這些文件。 你可以從這個github上頁https://github.com/github/gitignore

0

之間「文件從未在檢查並.gitignored」區別與「文件被簽入,但隨後RM-ED並一直尋找的gitignore模板的集合。 gitignored「比你推斷的要少。 如果從未添加該文件並將其放入.gitignore會按預期工作,然後刪除該文件,您可以將它放入.gitignore中,在可能一輪的困難之後,它應該開始工作。

(這將是情況下,例如,如果使用git pull更新服務器的拉提交該刪除的文件可能會刪除文件 - 儘管它應該顯示爲衝突。但隨後的拉取會忽略該文件,特別是如果你已經將它添加到.gitignore。但我離題了,我已經在評論中掩蓋了我的困惑......)

所以問題是如何從歷史中刪除文件,就好像它從未被添加過,雖然我懷疑它會幫助,這裏是你如何做到這一點:

你必須「重寫」引入文件的提交(或提交),以及任何落後於此提交的提交。如果這是一個共享存儲庫,那麼在重寫之後,每個人都必須轉換到重寫 - 最簡單的辦法是讓所有人都放棄其當前的repo並重新克隆。這意味着你必須協調一個「不變」窗口;如果有人在該窗口開始處的截止後做出改變,則需要將其重新編入重寫的樹中。

現在,如果最近添加了文件,並且在引入它的提交之後沒有很多歷史記錄,那麼這可能是一個相對簡單的過程,您甚至可以使用一些快捷方式。但一般解決方案是使用git filter-branch或BFG存儲庫清潔器。

這兩者中,BFG更簡單快捷(因爲這是它專門設計用於解決的任務之一)。它的作者認爲唯一安全的過程是手動從當前提交中移除文件,測試當前提交中的所有內容都按預期工作,然後使用BFG清理歷史記錄。我認爲這過於迂腐,並向他解釋了爲什麼,但他堅持了下來;所以你必須做出自己的想法。

如果您選擇使用filter-branch您可以使用索引過濾器;它是git過濾器文檔中的庫存示例之一,所以我只是在那裏查找它。

0

解決此問題的簡單而安全的方法是將要排除的文件添加到.gitignore

如果文件已被跟蹤(之前添加並提交),則還需要將其從存儲庫中刪除。這可以通過告訴git只刪除被跟蹤的版本而不刪除你想要保留的本地文件來完成。

git rm --cached <file>是將執行此操作的命令。當您提交更新以及.gitignore更新時,存儲庫將停止跟蹤並開始忽略該文件。

相關問題