【问题标题】:git ignore and untrack folder on remote servergit 忽略并取消跟踪远程服务器上的文件夹
【发布时间】:2018-05-23 10:17:48
【问题描述】:

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

我在哪里: 我有一个本地存储库,我推送到实时服务器,其中包括 /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 中,它们需要保留在那里,以便将来忽略该文件夹。那我该怎么办?

【问题讨论】:

  • 好的,当我最初阅读这篇文章时,我了解到您在原点上运行了 3 个步骤(我的回答部分基于这种理解),但从其他答案的 cmets 中,我会说不清楚.那么:您在哪个 repo(源或本地克隆)上运行了这些步骤?
  • 好的,所以遥控器是我一直推送到的一个裸仓库,仅此而已。自从我从 CMS 存储库克隆以来,我只使用过本地存储库,它是源/主存储库。这也是我从中得到的,等等
  • 我会非常满意一个解决方案,我完全删除文件夹并在之后添加它,同时忽略它以供将来提交,但这似乎也不起作用(我尝试删除文件夹,提交并推送,然后添加到 gitignore 并从索引中删除并使用 add --force 重新添加,但是当我在那之后删除本地文件夹时,即使之前被忽略和删除,更改也不会被跟踪提交)。我知道我对 git 的理解很差,但似乎不可能做到这一点。
  • 好的...如果远程是裸机,那么您将如何更新生产服务器?您在问题中说“推送到实时服务器”;这意味着服务器是非裸远程。
  • 我只是做 git push ,并最初将其设置为一个裸仓库,因为这是推荐的部署,我现在了解到,根本不推荐。所以也许它不是裸露的,但是当我在服务器上执行 git status 时,它告诉我没有 repo。所以,好吧,我迷路了。但是,推送确实没有任何问题。

标签: git gitignore git-assume-unchanged


【解决方案1】:

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


索引标志(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

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

【讨论】:

  • 好的,感谢您的澄清和建议的解决方案。我实际上是在本地而不是远程执行此操作,然后只是想将 /content 从任何进一步的提交和推送中排除。出于某种原因,我的远程仓库告诉我 git status 上没有任何内容,即使 .git 在我的 cd 中。我会尽快回复你。
  • @lthz :好吧……好吧,我将根据这些信息重写这个答案。
  • 感谢您的解释。我最终在远程服务器上重做了 repo,因为我无法让它以这种方式工作。我仍然非常感谢您的努力并理解它应该在理论上起作用。毕竟这是一个混乱的设置。
【解决方案2】:

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

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

最佳解决方案:

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

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

【讨论】:

  • 是的,我知道 gitignore 的基本工作原理,这就是为什么我 rm — 将它们缓存在本地并尝试标记它们假设未更改。除非我误读了您的答案,否则最后一部分是我想要做的,但使用以前跟踪的文件。那怎么办?
  • 我做了一个提交,将文件夹删除到实时服务器并将其添加到 git 忽略。然后我通过强制添加再次将其重新添加以再次提交并将其推送到服务器。我会看看这是否有效。
  • “我做了一个提交,将文件夹删除到实时服务器并将其添加到 git ignore。然后我通过强制添加再次将其添加回来以再次提交并将其推送到服务器。我会看看这是否有效”不会奏效。唯一的解决方案:将其保存在远程仓库中,并且您不会通过不添加到暂存区域来提交任何更改。
  • 是的,这正是我想要做的。但是当他们已经在那里并被跟踪时,如何“保留”他们。
  • 只有你使用“git add”添加的文件才能被提交,如果改变你会看到它们。只需要确保不要使用 git add 将它们添加到暂存区域,稍后会使用“git commit”提交。它的开发者预防措施。
【解决方案3】:

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

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

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

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

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

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

【讨论】:

  • 我会在未来注意到这一点,我明白为什么。但是必须可以在事后排除两边的文件夹。毕竟完全可以在本地进行。
  • 不,不是。您可以在服务器上执行 git rm -r --cached content/* 并将其拉到您的本地(这将删除您的本地内容副本,但您可以备份它)。但是如果你对实时服务器的唯一访问是 git,那就没有办法了。
  • 这是否意味着服务器的索引与我的本地存储库不同?这样我就可以远程管理文件夹并且它不会在推/拉时更新它?
  • @lthz - 每个 repo 都有自己的索引,是的。但是不,回购的索引并不以您似乎指示的方式管理推/拉更新的内容。索引的意思是“从这个 repo 提交的内容”
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 2018-09-29
  • 2021-02-04
相关资源
最近更新 更多