我添加并提交了一个错误的文件夹。修复.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中应忽略的文件git pull
时,不应删除该文件。服务器是指存储库的克隆,而不是存储库本身。它只是克隆了存储库的另一台机器
更新简短说明:
让我们考虑repo-server | local-machine | deploy-server
..我想通过local-machine
从存储库中删除一些文件(如果另一个local-machine-2
git clone
存储库它没有获取这些文件)当我通过deploy-server
更新git pull
时,但是我不希望从deploy-server
答案 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 repocd ~/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脚本同步所有此类更改。