[英]Git push does not remove deleted files
我不是 GIT 專家,如果這是一個錯誤的論壇,請原諒我,但我正在使用 GIT 將代碼部署到我的生產服務器,這工作正常,我只是執行git push production master
,其中production
指向我的 WPEngine 服務器和它顯然是 master 分支的副本。
這種方法的問題在於,我們需要在 repo 中包含 prod 工作所需的一切。 這包括dist/
(生成的 CSS/JS 等)以及vendor/
(作曲家安裝的第三方庫)之類的東西,這顯然不理想。
為了解決這個問題,我有一個(在我看來)單獨的.gitignore
的簡單想法。 一為origin
,一為production
。 我設置的方式是我有我的正常.gitignore
然后我還有一個.prodignore
。
然后我編寫了一個簡單的 shell 腳本 ( deploy.sh
),它執行以下操作:
瀏覽每個.prodignore
文件並將其重命名為.gitignore
:
for prodignore in $(find . -name '.prodignore'); do gitignore=$(echo $prodignore | sed 's/prodignore/gitignore/') mv $prodignore $gitignore done
從 GIT 中刪除所有文件,但將它們保留在磁盤上: git rm -r --cached --quiet .
(這負責刪除現在在新.gitignore
——比如src/
)
現在使用新的.gitignore
重新添加所有文件: git add --all
(這負責添加以前在.gitignore
文件 - 如dist/
)
提交並推送到production
遠程: git commit --quiet -m 'Sleek Deploy' && git push --quiet --force production master
最后返回一次提交,以便我們撤消剛才所做的一切: git reset HEAD~ && git reset --hard HEAD
這一切也都很好。 正確的新文件被推送到production
,我的本地存儲庫和origin
看起來仍然不錯,據我所知沒有奇怪的歷史記錄。
什么不工作,但是-這是我最近才發現-是,如果我刪除我的本地機器的文件時,推到刪除origin
,然后部署到production
使用上述步驟刪除的文件不會被刪除。
為什么是這樣? 我能做些什么來確保它被刪除嗎? 我對此的整個方法有缺陷嗎? Imo 為單獨的遙控器提供單獨的.gitignore
文件是解決這個問題的一個簡單的解決方案,但也許我已經咬掉了我無法咀嚼的東西。
值得注意的是,如果我不--force
push 在第 4 步,遙控器會告訴我我們不同步(這是有道理的,因為它有一個實際上並不存在於其他任何地方的提交 - 對吧?)
編輯:更多信息:
當我像往常一樣執行git push production master
並且production
是master
的副本時,我從來沒有遇到過這個問題
這與.gitignore
無關。 我正在談論的文件從未出現在.gitignore
或.prodignore
。 我提到它們只是為了提供背景信息以及為什么我需要將從未推送到源的提交提交到生產中。 這只會發生在我:
origin
production
origin
(文件不再在 repo 中)production
(由於某種原因,該文件仍在production
服務器上) 如果我從不將文件推送到production
開始,只是將其推送到origin
然后將其刪除,那么它永遠不會在production
結束。
據我所知,如果有幫助, production
是一個裸回購。
如果刪除的文件在新的.gitignore
,它肯定不會被刪除,因為您的提交根本不會查看該文件。
如果它是,並且您仍然希望將其刪除,則必須使用原始.gitignore
文件推送到生產環境,然后繼續“Sleek Deploy”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.