【问题标题】:How do I stop git from deleting what is on a server subdirectory?如何阻止 git 删除服务器子目录中的内容?
【发布时间】:2016-03-11 21:47:03
【问题描述】:

我的主目录结构是/site_program_files/users/usr1

我不希望 Git 触及 /users 目录和子目录中的内容... 因此,我已将 /users 添加到我的 .gitignore 文件中并进行了提交然后推送。并且还使用 git rm -rf /users 删除了之前的内容。

但是现在,每次我推送它都会删除我的用户在托管网站上的 /users 目录中更新的所有文件。我想要的只是让 git 不影响服务器上 /users 子目录中的内容,无论我正在做什么来测试我的本地版本。我做错了什么?

【问题讨论】:

  • 我猜是因为.gitignore。它会忽略所有文件,因此当您推送时,它会发送一个空文件夹来替换服务器上的文件夹。
  • 这个 Git s*ht 的逻辑太糟糕了 ;-) 我只是希望它不要弄乱那个子目录,我该怎么办?
  • 您曾要求 git 跟踪 users/ 中的所有内容,后来又告诉它删除 users/ 中的所有内容。很自然,每个接受“从users/ 删除”提交的克隆都会删除users/ 目录;无论如何,这就是提交的全部内容!但从那时起,users/ 将保持不变。所以这对每个克隆都是一次性的,他们总是可以从以前的版本中检索users/ 中的文件。
  • 其实@KeyWeeUsr 的说法是完全错误的。 .gitignore 不会强制清空目录。它只是没有告诉您有要添加的文件。

标签: git


【解决方案1】:

(我假设您的托管网站有某种自动部署脚本。除非您显示此脚本,否则我们必须对其进行一些假设。现在我假设它主要或仅包含 git checkout 命令。)

编辑:实际部署代码似乎是自定义 OpenShift Ruby 脚本(此链接页面上从未显示):https://developers.openshift.com/en/managing-deployments.html。熟悉 OpenShift 和 Ruby 的人或许可以评论默认部署脚本的实际作用。如果不仅仅是git checkout(显然不是),下面的一些假设不太可能成立。

编辑 2:这最终似乎是关于 OpenShift 的问题。这个问题似乎与 git 无关。

在 git 中你无法真正解决这个问题,至少在没有自定义黑客攻击的情况下是这样。原因很简单:

  • 据 git 所知,您(在托管网站上)要求它从 $old_commit(无论是什么 ID)移动到 $new_commit(另一个 ID)。

    李>
  • 所以,git 比较 $old_commit 中的内容与 $new_commit 中的内容。

  • 旧提交有文件users/usr1/foousers/usr2/bar。新的提交没有。

  • 因此,git 必须删除这些文件,以便正确地从旧文件过渡到新文件。

Git 会在每次你从$old_commit 移动到$new_commit 时执行此操作,因为这些是将工作树从$prev_commit 转换为$new_commit 所需的指令。在$new_commit 中,文件在.gitignoredoesn't mean "ignore", really)中并不重要:重要的是它们在$old_commit 而不是$new_commit

但是,我们可以观察到另一件事:如果运气好的话,git 只会执行从 $old_commit$new_commit 的转换一次。那么,我们需要做的是在托管网站上:

  1. 将所有珍贵的用户文件移开,让它们暂时不以原来的名称存在;
  2. 使 git 进行从旧到新的转换(应该默默地“删除”现在不存在的路径);和
  3. 将宝贵的用户文件移回。

这里的缺点是,如果您曾经以某种方式返回到托管网站上的$old_commit——或者实际上,任何具有这些文件的旧提交——然后将其转换为@987654342 @ (或任何不再有文件的新提交),git 将再次删除文件。

如果 git 有一个忽略语法和/或将特定文件标记为“珍贵,不要破坏,尽管也不要源代码控制”的文件,这可能会很好;但它没有(至少,现在不是)。

【讨论】:

  • 幸运的是,服务器上 /users 目录中的所有内容仍然只是测试垃圾。因此,此时网络应用程序从数据库中重新创建了 /users/usr1。但是现在如果我在我的 mac 上改变一些东西并再次提交 push,它会再次清除那些目录吗?或者它会遵守 .gitignore 文件中的 /users 吗?我只想告诉它忘记/忽略它曾经或将要对 /users 所做的一切
  • 一旦服务器的当前提交是其中没有用户文件的提交,从该提交移动到另一个也没有用户文件的提交,git 不会 删除 用户文件。但是,部署的内容取决于服务器上的精确部署脚本,您没有显示,因此无法确定。
  • 这就是我认为可能有用的方法。在我的 mac 上删除 /users 及其子目录,然后执行 git add 和 git commit。然后在我的 Mac 上重新创建 /user,然后再次 git add 然后提交。然后Git推送到服务器
  • 我不知道你在上面的评论中最初是什么git adding。请记住,git addgit rm --cached 都只是调整 index (将在 next 提交中调整)。当您git push 时,您将提交(而不是索引)传输到推送到存储库。该站点对新提交的处理取决于部署脚本代码。
  • 此时不是 push 本身在做,也不是 git 在做,而是 别的东西。我不知道如何更好地告诉你,它是部署脚本中的东西(不是 git)。 Git 有很多缺陷,但不是这个特定的缺陷。鉴于它在部署脚本中,您将不得不更改部署脚本。没有其他任何帮助。
猜你喜欢
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2021-09-06
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多