【问题标题】:Delete file from Git - confusion从 Git 中删除文件 - 混乱
【发布时间】:2015-07-29 14:19:33
【问题描述】:

我正在尝试学习使用 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

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

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

阅读这个 SO 问题:How can I delete a file from 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 说它是最新的,但文件仍在网络根目录中的原因吗?如果是这样,我要求删除的文件可能出于什么原因不删除?!

【问题讨论】:

  • 只要您git push origin master,就应该在遥控器上删除该文件。您可以将git push 命令的输出添加到您的问题中吗?您可能需要先pull,然后再push
  • "但是这只会删除本地副本。远程副本仍然存在!"很确定那是假的。上述步骤将删除本地和远程副本。请确保您运行的是 git rm,而不仅仅是 rm
  • 对于第二个问题,下次他们拉取时,git 会从他们的工作目录中删除该文件,因此不会神奇地重新添加它。
  • 我也认为git push origin master期间有错误输出。请发布控制台输出。
  • 感谢您的 cmets 到目前为止,我已经添加了 2 个命令输出的屏幕截图。

标签: git fortrabbit


【解决方案1】:

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

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

您应该做的是在服务器上create a bare repository,然后在服务器上克隆您的本地结帐并从中提取更改。

【讨论】:

  • 你不能在服务器上创建一个git仓库,它是àPaas
  • @edi9999 嗯?是的你可以。事实上,就我所见,在服务器上使用 git 存储库是一种非常常见的工作流程。甚至 GitHub 存储库在技术上也只是服务器上的 git 存储库。
  • 好吧,也许你可以,但是如果你使用他们的 git 存储库(缩放,...),这个平台会给你带来全部好处。看我的回答。
  • @edi9999 啊,有道理。我对 Fortrabbit 不熟悉,所以我的回答总体上更针对 git。
  • 感谢您对 Git 的总体解释,因为我对 git 知之甚少,所以能获得所有信息真是太好了 :)
【解决方案2】:

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

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

【讨论】:

  • 有点离题,但这对我来说似乎是一种处理“运行时内容”的非常奇怪的方式。 git 无论如何都不会删除未跟踪的文件。仅删除您在新修订中明确删除的跟踪文件。我猜他们实际上并没有使用git 来部署更改?
  • 这似乎是一种奇怪的处理方式!不幸的是,我知道的还不够多,无法更好地了解!我已经尝试了部署文件,正常删除了该文件,并且它也从远程服务器中删除了。谢谢你的回答,我猜它一定是FortRabbit特有的!
  • 我认为他们使用 rsync 在 git 服务器和构建应用程序的不同节点之间进行部署
  • 有道理。由于 git 实际上并没有参与部署这些文件,因此他们必须提出自己的机制来确保未跟踪的文件不会被破坏。
【解决方案3】:

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

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

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

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

这是一个逐步的过程:

  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 的答案。)

【讨论】:

  • 我按照它进行到第 3 步,在 git status 之后,它确实说我的本地分支提前 1 次提交。当我运行git push origin master 时,它运行了推送。当我检查远程服务器时,testfile1.php 文件仍然存在 :( 当我退出并再次运行 git push origin master 命令时,它说一切都是最新的!我很困惑!
【解决方案4】:

使用“git commit -a”

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

【讨论】:

    【解决方案5】:

    在本地删除文件

     rm testfile1.php
    

    然后运行,

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

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

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

    【讨论】:

      【解决方案6】:

      第一:

      rm testfile1.php
      

      然后:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-01
        • 2012-09-10
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 2011-08-30
        • 2017-01-18
        相关资源
        最近更新 更多