我添加并提交了一个错误的文件夹。修复 .gitignore 文件后,我需要从存储库中删除这些文件,但我不希望在服务器上运行 git pull
时删除这些文件。
我已经按照此处的建议尝试了 --cached
标志 Remove a file from a Git repository without deleting it from the local filesystem
但它就是行不通。我通过 rm --cached file
删除文件。我 promise 被删除的事实。但是当我 git pull
时,它会从服务器中删除该文件。
更新示例:SF2 参数文件(应忽略,因为它因机器而异)
app/config/parameters.yml
- 在 .gitignore 中应该忽略的文件- 不小心被 push 仓库
- 修复 .gitignore 文件
- 我需要将其从存储库中删除,但是当我在服务器上执行
git pull
时,不应删除该文件。 - 在本例中非常简单,只需在服务器上手动备份一个文件,git pull(删除文件),恢复备份。
- 但就我而言,有很多不同的文件夹/文件。
服务器是指存储库的克隆,而不是存储库本身。它只是另一台克隆了存储库的机器
更新的简短说明:
让我们考虑repo-server |本地机 | deploy-server
.. 我想通过 local-machine
从存储库中删除一些文件(如果另一个 local-machine-2
git clone
存储库它没有得到这些文件),但是 当我通过 git pull
更新 deploy-server
时我没有希望从 deploy-server
最佳答案
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 将中止 pull 并抛出一个错误提示,您对以下文件的本地更改将被 merge 覆盖
。您可能现在记得您运行了这个命令,但过一段时间后,您就记不起来了,并且可能很难找出哪里出了问题。
2) 使用 git submodules
要使用子模块,您必须从父仓库中完全删除文件夹(比如 app/config
)
git rm -r --cached app/config/
并在 app/config/中创建一个新的 repo
潜在问题 - 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"
2 和 3 之间的区别在于,使用 git 子模块,您可以获得存储库之间的确切关系,但是使用嵌套存储库,您将错过该信息。
此外,您还需要为子模块中的每个此类文件夹创建一个额外的 git 存储库,但您可以使用一个额外的存储库来使用 shell 脚本同步所有此类更改。
关于Git:从存储库中删除文件/文件夹,但在运行 git pull 时不从 git clones 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19161577/