Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Git中删除文件-混淆_Git_Fortrabbit - Fatal编程技术网

从Git中删除文件-混淆

从Git中删除文件-混淆,git,fortrabbit,Git,Fortrabbit,我正在尝试学习使用Git,我已经掌握了拉和推等的基本知识,但是我对删除感到困惑 这就是我所做的(与fortrabbit和laravel一起): 创建了一个Laravel项目 在项目文件夹中运行git init. 运行git remote add origin… 运行git add-A 运行git提交-am'Initial' 运行git push-u原始主机 现在,我的本地副本与远程副本匹配 现在我想删除一个文件,因此我创建了一个测试文件: 运行触摸testfile1.php 我添加文件,

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

这就是我所做的(与fortrabbit和laravel一起):

  • 创建了一个Laravel项目
  • 在项目文件夹中运行
    git init.
  • 运行git remote add origin…
  • 运行
    git add-A
  • 运行git提交-am'Initial'
  • 运行git push-u原始主机
现在,我的本地副本与远程副本匹配

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

  • 运行
    触摸testfile1.php
我添加文件,提交它,然后推送它。现在我在本地和远程都有了测试文件

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

阅读这个问题:它说我应该做:

  • git rm testfile1.php
  • git提交-m'已删除文件'
  • git推送原始主机

但是,这只会删除本地副本。远程副本仍然存在

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

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

感谢您的帮助

编辑

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

第一幅图是我输入的
git rm testfile1.php
文件。然后输出
rmtestfile1.php
,并返回提示符。当我使用SSH返回远程版本时,testfile`.php仍然存在:/

另一次编辑

我刚刚阅读了Fortrabbit提供的一些帮助文章,主要是这篇:

它说它会覆盖,但不会删除


这就是为什么git说它是最新的,但文件仍然在web根目录中的原因吗?如果是这样,有什么理由不删除我要求删除的文件

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

git rm testfile1.php
git commit -m 'deleted file'
git push origin master
你只做了第一个,你需要提交并推送到远程删除那里的文件

重要备注:通常,当您推送到远程存储库时,它应该包含文件

以下是一个循序渐进的过程:

  • 本地和远程是相同的
  • git rm testfile1.php

  • 本地testfile1.php已删除,但未提交此更改。testfile1.php仍然存在于远程服务器上
  • git提交-m'已删除文件'

  • 删除本地testfile1.php,提交此更改。您的本地分支比远程分支提前1个提交。(testfile1.php仍然存在于远程服务器上)
  • git推送原始主机

  • 本地和远程都是相同的(如果您在远程上的裸存储库上。否则,请参阅@Ajedi32的答案。)

  • 在本地删除该文件

     rm testfile1.php
    
    然后跑,

     git rm testfile1.php
     git commit -m 'deleted file'
     git push origin master
    
    (我在日常生活中就是这样做的。)


    如果您删除文件并成功推送您的更改,则其他人将无法推送其更改,直到他们
    pull
    更改。在此过程中,该文件将从repo的克隆中删除。有时,如果在本地将更改提交到同一文件,则它们可能会发生冲突,这表明该文件在远程删除,在本地更改。他们可以解决冲突,然后使用“git commit-a”推送更新

    如果您希望下一次提交应记录工作树中跟踪文件的所有修改,并记录使用rm(而不是git rm)从工作树中删除的文件的所有删除,请使用git commit-a,因为它将自动注意并记录所有删除。通过使用git add-u,您也可以在不提交的情况下获得类似的效果。

    首先:

    rm testfile1.php
    
    然后:


    在我的日常工作中,无论是创建、修改还是删除文件,最后三个步骤都是相同的。这对我来说很好。

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

    通常,服务器上的git存储库被创建为一种称为“裸存储库”的东西。裸存储库没有工作目录,它们只包含底层git对象数据库。不过,在您的案例中,您在服务器上创建了一个完整(非裸)的repo,并将其用作您的远程服务器。不建议这样做,因为它会产生类似于您在此处发现的问题


    您应该在服务器上执行操作,然后在服务器克隆上进行本地签出并从中提取更改。

    这个问题实际上是Fortrabbit特有的:

    覆盖但不删除 旧文件将被通过Git更新的文件覆盖。但是,Git部署不会删除任何内容。因此,当您从Git repo中删除一个文件时,它仍将存在于Web空间中

    这是处理“运行时内容”的安全默认设置。当您实现图像上传表单之类的功能时,您将向Web空间上传额外的内容。这些文件直接在Web空间上生成。因此,它们不是Git回购的一部分。但最有可能的情况是,您不希望在推送代码更改时删除这些内容

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

    git add . git commit -m 'message' git push
    version: 1 
    strategy: fullsync
    excludes:
         - app/storage/ 
         - uploads/
         - vendor/