从Git中删除文件 - 混淆

时间:2015-07-29 14:19:33

标签: git fortrabbit

我试图学习使用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

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

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

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

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

但是只删除本地副本。远程副本仍在那里!

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

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

感谢任何帮助。

修改

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

enter image description here enter image description here

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

另一个编辑

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

它表示它会覆盖,但不会删除。

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

6 个答案:

答案 0 :(得分:2)

好吧,好吧,现在我看到了问题。您期望git push更改服务器上git存储库的工作目录中的文件。这不是它的工作原理。推送到远程仓库只会更新git对象数据库,而不是工作目录。如果您在服务器上运行git log,您会看到您推送的提交实际上已存在,但工作目录尚未更新。服务器上的git reset --hard应该修复它。

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

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

答案 1 :(得分:1)

您没有完成教程中提出的所有命令:

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

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

重要提示:通常当你推送到遥控器时,你会推送到bare存储库,包含文件...

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

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

    1. 本地testfile1.php已删除,但此更改未提交。 testfile1.php仍然存在于远程。
    2. git commit -m 'deleted file'

      1. 删除本地testfile1.php,提交此更改。您的本地分支在远程之前提交1次。 (testfile1.php仍然存在于远程)
      2. git push origin master

        1. 本地遥控器是相同的(如果你在遥控器上的存储库。否则,请参阅@ Ajedi32的答案。)

答案 2 :(得分:1)

这个问题实际上特定于Fortrabbit:http://help.fortrabbit.com/git#toc-overwrite-but-not-delete

  

覆盖但不删除

     

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

     

这是处理“运行时内容”的安全默认值。当您实施类似图像上传表单的内容时,您将上传其他内容到您的网站空间。这些文件直接在网站空间生成。所以他们不是Git回购的一部分。但是,每当推送代码更改时,您很可能不希望删除这些内容。

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

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

该文件的内容应为:

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

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

答案 3 :(得分:0)

在本地删除文件

 rm testfile1.php

然后跑,

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

(这就是我在日常生活中的表现。)

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

答案 4 :(得分:0)

使用“git commit -a”

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

答案 5 :(得分:0)

首先:

rm testfile1.php

然后:

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

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