繁体   English   中英

从Git删除文件-混乱

[英]Delete file from Git - confusion

我正在尝试学习使用Git,并且我已经掌握了拉动和推入等基础知识,但是我对删除感到困惑。

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

  • 创建一个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

您只执行了第一个,则需要提交并推送到远程删除该文件。

重要提示 :通常,当你推到一个遥控器,你推到一个光秃秃的仓库,它应该包含的文件...

这是一个逐步的过程:

  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. 本地远程是相同的(如果您位于远程的存储库上,否则,请参阅@ Ajedi32的答案。)

这个问题实际上是针对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM