Git:从存储库中删除文件/文件夹,但在运行git pull时不从git clones中删除

use*_*048 5 git

我添加并提交了一个错误的文件夹.修复.gitignore文件后,我需要从存储库中删除这些文件,但我不希望git pull在服务器上运行时删除这些文件.

我已经尝试了--cached这里建议的标志从Git存储库中删除文件而不从本地文件系统中删除它

但它只是不起作用.我删除了该文件rm --cached file.我承诺被删除的事实.但是当git pull它从服务器中删除该文件时.

更新示例:SF2参数文件(应忽略​​,因为它因机器而异)

  • app/config/parameters.yml - .gitignore中应忽略的文件
  • 被意外地推入存储库
  • 修复.gitignore文件
  • 我需要从存储库中删除它,但是当我git pull在服务器上执行时,不应删除该文件.
  • 在这个例子中,只需一个文件即可在服务器上手动备份,git pull(文件被删除),恢复备份非常简单.
  • 但在我的情况下,有很多不同的文件夹/文件.

服务器是指存储库的克隆,而不是存储库本身.它只是克隆了存储库的另一台机器

更新简短说明:

让我们考虑repo-server | local-machine | deploy-server..我想通过local-machine存储库中的一些文件删除(如果另一个local-machine-2 git clone存储库它没有获取这些文件),但是当我更新deploy-server通道时git pull我不希望从存储库中删除这些文件deploy-server

mu *_*u 無 2

IMO,你有三个选择。

1)update-index--assume-unchanged标志一起使用

git update-index --assume-unchanged app/config/parameters.yml
git update-index --no-assume-unchanged app/config/parameters.yml #Undo effect of previous command
Run Code Online (Sandbox Code Playgroud)

您不会从 git 存储库中删除该文件,但会忽略使用此文件对其进行的任何本地更改。

问题是,如果任何上游提交更新了这些文件,git 将中止拉取并抛出一个错误,指出Your local changes to the following files would be overwritten by merge. 您现在可能记得您运行过此命令,但一段时间后,您就不会记得了,并且可能很难弄清楚出了什么问题。

2)使用git子模块

要使用子模块,您必须app/config从父存储库中完全删除文件夹(例如)

git rm -r --cached app/config/
Run Code Online (Sandbox Code Playgroud)

并在 app/config/ 中创建一个新的存储库

潜在问题 - 1)可能需要多个子模块,具体取决于您的应用程序结构 2)如果所有更改的都是配置文件,那么这对于您将面临的头痛来说绝对是一个过度的杀伤力。

3)使用嵌套的git存储库

在这个中,您在第一个中创建一个 git 存储库

cd ~/Desktop/project
git rm -r --cached app/config/
echo app/config >> .gitignore
cd app/config
git init && git add . && git commit -m "config paramters"
Run Code Online (Sandbox Code Playgroud)

2 和 3 之间的区别在于,使用 git 子模块,您可以获得存储库之间的确切关系,但是使用嵌套存储库,您将错过该信息。

此外,您还需要为子模块中的每个此类文件夹创建一个额外的 git 存储库,但您可以使用一个额外的存储库来使用 shell 脚本同步所有此类更改。