-1

我知道类似的问题已被多次询问,但我无法让它适用于我的案例。

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

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

所以到目前为止我做了什么:

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

/content/

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

git rm -r --cached content/*

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

git update-index --skip-worktree

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

致命:无法标记文件

由于文件位于 .gitignore 中,并且它们需要保留在那里,以便将来忽略该文件夹。那我该怎么办?

4

3 回答 3

0

更新以反映 OP 的更正,更新是在本地克隆而不是服务器上完成的,并且服务器是一个带有钩子的裸仓库,它通过以下方式更新工作文件夹checkout -f


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

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

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

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

在服务器上,您需要防止工作树被即将到来的推送自动更新。因为您的服务器端 repo 是裸露的,并且更新是通过钩子发生的,所以禁用钩子。(要么将 post-receive 脚本移出 hooks 目录,要么编辑它并注释掉签出更改的行。)

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

git add .gitignore
git commit
git push

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

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

将同步备份。然后撤消您为禁用挂钩所做的一切。

于 2018-05-23T12:56:01.713 回答
-1

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

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

替代方案:将您的内容放在您的 git 文件夹之外。

编辑:为解决您的问题:在遥控器上执行以下操作:

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

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

于 2018-05-23T11:44:32.043 回答
-1

只是为了首先明确 gitignore 的概念,

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

最佳解决方案:

让它在远程存储库上,您不要提交此文件夹的文件。

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

于 2018-05-23T11:10:37.807 回答