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

时间:2013-10-03 14:13:22

标签: git

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

我已尝试Remove a file from a Git repository without deleting it from the local filesystem

中建议的--cached标记

但它不起作用。我按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

中删除这些文件

1 个答案:

答案 0 :(得分: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

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

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

2)使用git submodules

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

git rm -r --cached app/config/

在app / config /

中创建一个新的repo

潜在问题 - 1)根据您的应用程序结构可能需要多个子模块2)如果所有更改都是配置文件,那么就您将面临的麻烦而言,这将是一个明确的过度杀伤。

3)使用嵌套的git存储库

在这一个中,你在第一个

中创建了一个git repo
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"

2& 2之间的区别3是使用git子模块,你可以得到repos之间的确切关系,但是对于嵌套的repos,你会错过这些信息。

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