另一个开发人员提交了他的本地版本的.gitignore文件。我想在本地修改这个文件,而不被唠叨:不显示在"git状态"上,没有"被checkout覆盖"的错误。
通常推荐的解决方案似乎是"git update-index——假定不变。gitignore"
它确实会阻止文件显示在"git status"中,但它会在更改分支时触发错误:
错误:您对以下文件的本地更改将被签出覆盖:.gitignore
更多的办法:
- "Add .gitignore to .gitignore" =>没有任何作用。
- "Add .gitignore to .git/info/exclude" =>没有任何作用。
- "git rm——cached .gitignore" => .gitignore显示在git状态中。
其他无用线程:
- http://stackoverflow.com/questions/767147/how-do-i-tell-git-to-ignore-gitignore
- http://stackoverflow.com/questions/10750351/git-hub-gitignore-error
那么,我的问题是,这真的可以做到吗?
谢谢你的宝贵时间。
编辑
从Shahbaz, Chris和jthill的有益评论中,我得出结论,我的问题的答案是"不"。git中似乎没有内置机制来完全忽略本地跟踪的文件。幸运的是,有几种变通方法在特定情况下是有用的。
谢谢大家的回答。
关于如何设置一个不会改变工作树或存储库中现有内容的内容过滤器的答案:
git config filter.pinned-content.clean 'git show HEAD:%f 2>&- || cat'
git config filter.pinned-content.smudge 'cat %f 2>&- || cat'
mkdir -p .git/info
echo .gitignore filter=pinned-content >>.git/info/attributes
过滤器在.gitattributes
手册中有文档记录,其思想是'clean'命令被输入到repo中的内容,'smudge'命令被输入到repo中的内容;上面的过滤器对用已经提交的内容替换您想要添加的内容,用您现在得到的内容替换checkout想要替换的内容。
如果签出的文件没有被更改(与提交的版本相同),并且你切换到一个已经删除了该文件的分支(或者从未有过它),git也会从工作树中删除它。您可以通过
获取内容。git show @{1}:path/to/file > path/to/file # or git show oldbranch:etcetera
如果文件与提交的版本不同,git将拒绝签出。
你可以创建一个全局的git ignore
https://help.github.com/articles/ignoring-files create-a-global-gitignore
另一个选择是修改本地gitignore并将其从本地跟踪中删除:
git update-index --assume-unchanged .gitignore
如果文件从上游更改,不确定是否会工作