[英]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.