我知道有多次问过类似的问题,但我不能让它适合我的情况。
我在哪里: 我有一个本地仓库,我推送到一个实时服务器,其中包括/ content文件夹及其子文件夹。在生产过程中没问题,因为我可以对/ content进行更改并推送它们。但由于这是一个使用CMS的网站,因此现在可以远程生成对内容的所有更改。
我想成为的地方: 我现在想要分离' / content及其子文件夹来自代码库,这样我就可以在本地删除hefty / content文件夹,而不会在实时服务器上删除它。这样我仍然可以在代码中进行更改并将它们推送到服务器,而人们可以使用CMS在/ content文件夹中创建文件和更改。
所以到目前为止我做了什么:
/content/
git rm -r --cached content/*
git update-index --skip-worktree
当我这样做时,我当然会得到:
致命:无法标记文件
由于文件位于.gitignore中,并且它们需要保留在那里,因此将来会忽略该文件夹。那我该怎么办?
答案 0 :(得分:0)
更新以反映来自OP的更正,更新已在本地克隆而非服务器上完成,并且服务器是带有挂钩的裸仓库,通过checkout -f
更新工作文件夹
索引标记(skip-worktree
或assume-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的概念,
最佳解决方案:
让它在远程存储库上,您不提交此文件夹的文件。
希望它为您的问题增添价值
答案 2 :(得分:-1)
您不应该使用git作为部署工具。
你能做什么:拥有一个没有内容文件夹的远程仓库。将内容文件夹添加到.gitignore。 让您的实时服务器从该远程仓库中取出。这不会更改内容文件夹的内容。
替代方案:将您的内容放在git文件夹之外。
修改:要解决您的问题:在远程上执行以下操作:
git rm -r --cached content/*
git commit -m "content deleted"
然后备份本地内容文件夹和git pull
。