如何阻止git删除服务器子目录中的内容?

时间:2016-03-11 21:47:03

标签: git

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

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

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

1 个答案:

答案 0 :(得分:3)

(我假设您的托管网站有某种自动部署脚本。除非您显示此脚本,否则我们必须对其做出一些假设。现在我假设它主要或仅由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_commitusers/usr1/foo中的内容。

  • 旧提交包含文件users/usr2/bar$old_commit。新提交没有。

  • 因此,git必须删除这些文件,以便正确地从旧文件转换为新文件。

Git会在每次从<{1}}移动到$new_commit时执行此操作,因为这些是将工作树从$prev_commit转换为{{}}所需的说明{1}}。在$new_commit中,文件位于$new_commitdoesn't mean "ignore", really)中并不重要:重要的是它们位于.gitignore而不是$old_commit 1}}。

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

  1. 将所有宝贵的用户文件移开,以便它们暂时不会以其原始名称存在;
  2. 导致git执行旧到新的转换(应该默默地&#34;删除&#34;现在不存在的路径);和
  3. 移回珍贵的用户文件。
  4. 这里的缺点是,如果你曾经以某种方式回到托管网站上的$new_commit - 或者实际上,任何旧的提交都有这些文件 - 然后将其转换为$old_commit(或任何不再有文件的新提交),git会再次删除文件。

    如果git有一个忽略语法和/或文件将特定文件标记为&#34;宝贝,不要破坏,但不要来源控制,这可能会很好。&#34 ;;但它没有(至少今天没有)。