2015-08-28 52 views
2

我們在組織中使用Git更新所有項目的服務器上的代碼。通常情況下,開發人員會忘記忽略應忽略的文件(如db config或data等),並將它們推送到我們的Git服務器。稍後將與運行代碼的實際服務器同步(藉助鉤子)。在服務器上執行git pull以獲取最新代碼。防止忽略的文件在抽取期間被移除

現在,如果我將任何特定文件添加到.gitignore並將其從indexpush中刪除它使用下面的命令到服務器。

git rm --cached config.php 
git add .gitignore 
git commit -m "removed config file and ignored it" 
git push origin master 

這將從Git中刪除文件,但不是從我的本地回購。它也將阻止它被進一步追蹤。

然後,在服務器上執行git pull這是刪除新忽略的文件導致的問題。簡單pull命令如下在服務器上執行:

git pull origin master 

我不想當從遠程Git倉庫中取出,以從服務器上刪除config.php文件。

有時我會以相同的方式刪除大量的文件,這些文件應保留在服務器上(代碼運行時)。

什麼是最簡單和可編程的解決方案呢?我開發了一個Node.js程序,它登錄到服務器並以編程方式運行pull命令。

+0

http://stackoverflow.com/a/31289998/6309可以幫助 – VonC

回答

2

你不能;您正在記錄刪除操作,並且在執行更新時會發生刪除操作。事實上,如果你犯了一個你不想在那裏的文件,你會想要發生這種情況;你不會指望它在事後留下來。

如果您確實想要防止這種情況發生,請在服務器上編寫一個提交掛鉤,驗證提交沒有在您不希望它們提交的顯式路徑添加任何內容,並禁止任何此類提交承諾從被推到首位。這樣開發人員將不得不在本地解決他們的提交。

請注意,'添加一個刪除文件的新提交'是不夠的,因爲臨時提交已經添加了它。有必要壓縮刪除提交與提交,它意外地將其添加到首位。

你怎麼教育你的用戶是一個單獨的問題...

+0

你是正確的。我明白它是如何工作的,它的好處。不會壓扁承諾重寫歷史?我不允許開發人員進行強制推動以防止覆蓋其他人的工作。 – shashwat

+0

你必須讓開發人員在上傳之前在自己的本地機器上進行壓扁。如果您編寫提交鉤子,它們不會損壞中央存儲庫。然後他們可以將他們重新設置爲最新版本,這樣他們就不會破壞共享存儲庫的歷史。 – AlBlue

+0

你說'在服務器上寫一個提交鉤子,但在大多數情況下,第一次提交是從開發人員的本地系統提交的。然後將它從我們的Git服務器克隆到服務器。 – shashwat