远程服务器上的git ignore和untrack文件夹

时间:2018-05-23 10:17:48

标签: git gitignore git-assume-unchanged

我知道有多次问过类似的问题,但我不能让它适合我的情况。

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

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

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

  1. 将文件夹添加到.gitignore:
  2. /content/

    1. 从索引中删除了该文件夹:
    2. git rm -r --cached content/*

      1. 尝试设置假设未更改,以便在推送时,/ content中的文件不会从实时服务器中删除:
      2. git update-index --skip-worktree

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

          

        致命:无法标记文件

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

3 个答案:

答案 0 :(得分:0)

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

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

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

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

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

在服务器上,您需要阻止即将推送的工作树自动更新。因为您的服务器端存储是裸的,并且通过挂钩进行更新,所以禁用挂钩。 (将接收后脚本移出hooks目录,或者编辑它并注释掉检查更改的行。)

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

git add .gitignore
git commit
git push

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

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

会重新同步。然后撤消你做的任何事情以禁用钩子。

答案 1 :(得分:-1)

首先要明确gitignore的概念,

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

最佳解决方案:

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

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

答案 2 :(得分:-1)

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

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

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

修改:要解决您的问题:在远程上执行以下操作:

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

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