git 忽略并取消跟踪远程服务器上的文件夹

git ignore and untrack folder on remote server

我知道类似的问题已经被问过多次,但我的情况无法解决。

我所在的位置: 我有一个本地存储库,我将其推送到实时服务器,其中包括一个 /content 文件夹及其子文件夹。在制作过程中没问题,因为我可以更改 /content 并推送它们。但由于这是一个使用 CMS 的网站,现在对 /content 的所有更改都将远程生成。

我想去的地方: 我现在想从代码库中删除 'detach' /content 及其子文件夹,这样我就可以在本地删除庞大的 /content 文件夹,而不会在实时服务器上删除它。这样我仍然可以更改代码并将它们推送到服务器,而人们可以使用 CMS 在 /content 文件夹中创建文件和更改。

到目前为止我做了什么:

  1. 将文件夹添加到 .gitignore:

/content/

  1. 从索引中删除了文件夹:

git rm -r --cached content/*

  1. 尝试设置 assume-unchanged 以便在推送时,/content 中的文件不会从实时服务器中删除:

git update-index --skip-worktree

当我这样做时,我当然会得到:

fatal: Unable to mark file

由于文件在.gitignore 中,它们需要保留在那里,这样以后该文件夹将被忽略。那我该怎么办?

首先要弄清楚gitignore的概念,

  • .gitignore 文件说我不会将这些文件和文件夹检测为版本控制系统的一部分。
  • 如果文件已经是版本控制系统的一部分,并且如果您尝试忽略它,那么它不会被忽略。
  • 您不能忽略属于远程存储库的文件。只有当您从远程仓库中删除它并在 gitignore 中添加该文件夹时,它才会被忽略。注意:在这种情况下,您不会在远程回购上有内容/。

最佳解决方案:

让它在远程仓库,你不要提交这个文件夹的文件。

希望它能为您的问题增加价值

您不应使用 git 作为部署工具。

您可以做什么:拥有一个没有内容文件夹的远程仓库。将内容文件夹添加到 .gitignore。 让您的实时服务器从该远程仓库中提取。这不会更改您的内容文件夹的内容。

备选方案:将您的内容放在 git 文件夹之外的某个地方。

编辑:解决您的问题:在远程上执行以下操作:

git rm -r --cached content/*
git commit -m "content deleted"

然后备份您的本地内容文件夹和 git pull

已更新以反映 OP 的更正,更新是在本地克隆而不是服务器上完成的,并且服务器是一个裸仓库,带有一个挂钩,可以通过 checkout -f


索引标志(skip-worktreeassume-unchanged)不是问题的解决方案,但您对原因的理解(与.gitignore有任何关系)不是正确的。相反,这些标志是在索引中的文件条目上设置的;你不能在这些文件上设置标志,因为你从索引中删除了这些文件。

您澄清了您提到的三个步骤(创建 .gitignore、运行 rm --cached、尝试设置索引标志)是在本地克隆上完成的。所以下一个问题是如何在不删除服务器的 content 目录的情况下将其与服务器同步。

索引和工作树一样是本地的。所以服务器还不知道你做了什么。下次您提交并推送它时,您需要采取措施正确更新服务器(否则内容目录将会丢失)。我建议现在就这样做,这样您就不会同时对杂耍进行其他更改(这样您就不会忘记执行额外的步骤)。

你需要在本地和服务器之间来回跳转,所以我会继续在每个上打开一个 shell。

在服务器上,您需要防止工作树被即将到来的推送自动更新。因为您的服务器端存储库是空的,并且更新是通过挂钩进行的,所以请禁用该挂钩。 (要么将 post-receive 脚本移出 hooks 目录,要么对其进行编辑并注释掉检查更改的行。)

现在 本地 您需要暂存 .gitignore 文件并提交更改(这将包括(从索引中)删除 content目录),然后推送:

git add .gitignore
git commit
git push

现在在服务器上您需要同步工作树,并重新启用挂钩。由于唯一的变化(除了抑制 content 文件夹)是 .gitignore 文件

git checkout --work-tree /path/to/webroot -- .gitignore

将同步备份。然后撤消您为禁用挂钩所做的任何操作。