5

我添加并提交了一个错误的文件夹。修复 .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

4

1 回答 1

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子模块

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

git rm -r --cached app/config/

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

潜在问题 - 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 和 3 之间的区别在于,使用 git 子模块,您可以获得 repos 之间的确切关系,但使用嵌套 repos,您将错过该信息。

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

于 2013-10-03T16:35:17.503 回答