从 Git 中删除文件 - 混乱

Delete file from Git - confusion

我正在努力学习使用 Git,我有点了解拉和推等的基础知识,但我对删除感到困惑。

这就是我所做的(使用 fortrabbit 和 laravel):

现在我的本地副本与我的远程副本匹配。

我现在想删除一个文件,所以我创建了一个测试文件:

我添加文件,提交然后推送。现在我在本地和远程都有了测试文件。

问题是删除它。这个问题分为两部分:

正在阅读这个 SO 问题:How can I delete a file from git repo? 它说我应该这样做:

然而,这只会删除本地副本。远程副本还在!

如果我从本地副本中删除它,它如何也从远程版本中删除?

我的第二个问题是,如果其他人有副本,他们怎么知道我已经删除了文件?如果他们将他们的副本推送回远程文件,它不会只是重新添加已删除的文件吗?

感谢任何帮助。

编辑

这是git rm命令的输出,命令后的远程版本:

第一张图片是我在输入 git rm testfile1.php 文件。然后它输出 rm testfile1.php 和 returns 到提示符。当我 SSH 回到远程版本时,testfile`.php 仍然存在:/

另一个编辑

我刚刚阅读了 Fortrabbit 提供的一些帮助文章,主要是这篇文章:http://help.fortrabbit.com/git#toc-behind-the-scenes

它说它覆盖,但不删除。

这就是为什么 git 说它是最新的,但文件仍在网络根目录中的原因吗?如果是这样,为什么我要求删除的文件可能不删除?!

您没有完成教程建议的所有命令:

git rm testfile1.php
git commit -m 'deleted file'
git push origin master

你只做了第一个,你需要提交并推送到远程删除那里的文件。

重要说明:通常当您推送到远程时,您推送到 bare 存储库,它应该 NOT包含文件...

这是一个循序渐进的过程:

  1. 本地和远程相同

git rm testfile1.php

  1. 本地 testfile1.php 已删除,但未提交此更改。 testfile1.php 仍然存在于遥控器上。

git commit -m 'deleted file'

  1. 本地 testfile1.php 已删除,此更改已提交。您的本地分支比远程分支提前 1 次提交。 (testfile1.php 仍然存在于遥控器上)

git push origin master

  1. 本地和远程是相同的(如果你在远程的 bare 存储库上。否则,请参阅@Ajedi32 的回答。)

删除本地文件

 rm testfile1.php

然后运行,

 git rm testfile1.php
 git commit -m 'deleted file'
 git push origin master

(我在日常生活中就是这样做的。)

如果您删除文件并成功推送您的更改,那么其他人将无法推送 his/her 更改,直到他们 pull 更改。在此过程中,该文件将从他们的回购克隆中删除。有时,如果他们在本地对同一个文件进行了更改,它们可能会发生冲突,这表明该文件在远程被删除并在本地被更改。他们可以解决冲突,然后推送更新

使用“git commit -a”

如果您打算您的下一次提交应该记录工作树中跟踪文件的所有修改,并记录所有已使用 rm 从工作树中删除的文件的删除(相对于 git rm) ,使用 git commit -a,因为它会自动通知并记录所有删除。您也可以通过使用 git add -u.

来产生类似的效果而无需提交

第一个:

rm testfile1.php

然后:

git add .
git commit -m 'message'
git push

在我的日常工作中,无论是新建、修改还是删除文件,最后三个步骤都是一样的。它对我来说很好用。

啊好的,现在我看到问题了。您希望 git push 更改服务器上 git 存储库工作目录中的文件。它不是这样工作的。推送到远程仓库只会更新 git 对象数据库,不会更新工作目录。如果您在服务器上 运行 a git log,您会看到您推送的提交实际上就在那里,但工作目录尚未更新。服务器上的 git reset --hard 应该可以解决这个问题。

通常,服务器上的 git 个存储库被创建为称为 "bare repository" 的东西。裸存储库没有工作目录,它们只包含底层 git 对象数据库。但是,在您的情况下,您在服务器上创建了一个完整的(非裸机)存储库并将其用作您的遥控器。不推荐这样做,因为它会产生类似于您在此处发现的问题。

你应该做的是 create a bare repository 在服务器上,然后在服务器克隆上进行本地检查并从中提取更改。

这个问题实际上是针对 Fortrabbit 的:http://help.fortrabbit.com/git#toc-overwrite-but-not-delete

Overwrite but not delete

The old files will be overwritten with the ones that have been updated thru Git. However, Git deployment will not delete anything. So when you delete a file from your Git repo it will be still there in the webspace.

This is the safe default to deal with "runtime contents". When you implement something like an image upload form, you will upload additional contents to your webspace. Those files are generated on the webspace directly. So they are not part of Git repo. But most likely you don't want these to be deleted whenever you push code changes.

您可以使用 fortrabbit.yml 文件配置该行为:

http://help.fortrabbit.com/deployment-file

文件内容应为:

version: 1 
strategy: fullsync
excludes:
     - app/storage/ 
     - uploads/
     - vendor/

完全同步意味着您的网络服务器的内容将与您的本地存储库完全一致。 excludes 键指定你不会自动同步哪些文件夹(你应该把所有可能包含用户数据的文件夹放在那里,比如头像,或者不在 git 但你的应​​用程序需要的东西,比如供应商文件夹)