[英]Delete file from Git - confusion
我正在尝试学习使用Git,并且我已经掌握了拉动和推入等基础知识,但是我对删除感到困惑。
这是我所做的(使用fortrabbit和laravel):
git init .
在项目文件夹中 git remote add origin ...
git add -A
git commit -am 'Initial'
git push -u origin master
现在,我的本地副本与我的远程副本匹配。
我现在想删除一个文件,所以我创建一个测试文件:
touch testfile1.php
我添加文件,提交然后推送。 现在,我在本地和远程都有测试文件。
问题是将其删除。 这个问题分为2部分:
阅读此问题: 如何从git repo删除文件? 它说我应该做:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
但是,这只会删除本地副本。 远程副本仍然存在!
如果我从本地副本中删除它,那么它也如何从远程版本中删除?
我的第二个问题是,如果其他人有副本,他们怎么知道我已删除文件? 如果他们将副本推回远程副本,难道它不会只是重新添加已删除的文件?
任何帮助表示赞赏。
编辑
这是git rm
命令的输出,以及该命令之后的远程版本:
第一张图片是我输入git rm testfile1.php
文件。 然后输出rm testfile1.php
并返回到提示。 当我通过SSH返回远程版本时,testfile`.php仍然存在:/
另一个编辑
我刚刚读过Fortrabbit提供的一些帮助文章,主要是这篇文章: http ://help.fortrabbit.com/git#toc-behind-the-scenes
它说它会覆盖,但不会删除。
这就是为什么git说它是最新的,但文件仍在Web根目录中的原因吗? 如果是这样,出于什么原因可能不会删除我要求删除的文件?
好的,现在我明白了。 您期望git push
更改服务器上git存储库的工作目录中的文件。 那不是它的工作原理。 推送到远程仓库仅更新git对象数据库,而不更新工作目录。 如果您在服务器上运行了git log
,则实际上会看到您推送的提交,但是工作目录尚未更新。 服务器上的git reset --hard
应该可以解决该问题。
通常,服务器上的git存储库被创建为“裸存储库”。 裸存储库没有工作目录,它们仅包含基础git对象数据库。 但是,就您的情况而言,您在服务器上创建了完整(非裸机)存储库,并将其用作远程服务器。 不建议这样做,因为它会产生与您在此处发现的问题类似的问题。
您应该做的是在服务器上创建一个裸存储库 ,然后在服务器克隆上进行本地签出并从中进行更改。
您没有完成教程建议的所有命令:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
您只执行了第一个,则需要提交并推送到远程删除该文件。
重要提示 :通常,当你推到一个遥控器,你推到一个光秃秃的仓库,它不应该包含的文件...
这是一个逐步的过程:
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
这个问题实际上是针对Fortrabbit的: http ://help.fortrabbit.com/git#toc-overwrite-but-not-delete
覆盖但不删除
旧文件将被通过Git更新的文件覆盖。 但是,Git部署不会删除任何内容。 因此,当您从Git存储库中删除文件时,该文件仍会留在网站空间中。
这是处理“运行时内容”的安全默认值。 当您实现图像上载表单之类的内容时,您会将其他内容上载到您的网站空间。 这些文件直接在Webspace上生成。 因此,它们不是Git回购的一部分。 但是很可能您不希望在每次更改代码时都将其删除。
您可以使用fortrabbit.yml文件配置该行为:
http://help.fortrabbit.com/deployment-file
该文件的内容应为:
version: 1
strategy: fullsync
excludes:
- app/storage/
- uploads/
- vendor/
fullsync意味着您的网络服务器的内容将与本地存储库中的内容完全相同。 excludes键指定不自动同步的文件夹(您应该在其中放置所有可能包含用户数据的文件夹,例如化身,或者不在git中但应用程序需要的东西,例如vendor文件夹)
本地删除文件
rm testfile1.php
然后跑
git rm testfile1.php
git commit -m 'deleted file'
git push origin master
(这就是我日常生活中的方式。)
如果删除文件并成功推送更改,那么其他人将无法推送其更改,直到他们pull
更改。 在此过程中,文件将从存储库的克隆中删除。 有时,如果他们在本地将更改提交给同一文件,则可能会发生冲突,这表明该文件在远程已删除,而在本地已更改。 他们可以解决冲突,然后推送更新
使用“ git commit -a”
如果您打算下一次提交应在工作树中记录对跟踪文件的所有修改,并记录所有使用rm(而不是git rm)从工作树中删除的文件的删除,请使用git commit -a,因为将自动通知并记录所有清除情况。 您也可以通过使用git add -u来实现类似的效果而无需提交。
第一:
rm testfile1.php
然后:
git add .
git commit -m 'message'
git push
在我的日常工作中,无论创建,修改或删除文件,最后三个步骤都是相同的。 这对我来说可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.