我可以在本地忽略文件而不污染其他人的全局Git配置吗?我有未跟踪的文件,在我的git状态是垃圾邮件,但我不想提交git配置更改为每一个小随机未跟踪文件,我在我的本地分支。
从相关的Git文档中:
Patterns which are specific to a particular repository but which do not need to be shared with other related repositories (e.g., auxiliary files that live inside the repository but are specific to one user's workflow) should go into the $GIT_DIR/info/exclude file.
号
.git/info/exclude文件的格式与任何.gitignore文件的格式相同。另一种选择是将core.excludesFile设置为包含全局模式的文件名。
注意,如果已经有未分页的更改,则必须在编辑忽略模式后运行以下操作:
1
| git update-index --assume-unchanged [<file>...] |
关于$GIT_DIR的说明:这是一个在整个git手册中使用的符号,只是用来指示到git存储库的路径。如果设置了环境变量,那么它将覆盖您所处的任何回购的位置,这可能不是您想要的位置。
- 如果未定义git_dir,它只是指向.git存储库的路径。
- 这似乎不起作用。Git仍然看到这些更改,并要求我提交它们。
- 注意,在添加到排除文件之后,一定要运行git update-index --assume-unchanged [...]。直到那时,这些变化才会被接受。
- 我不需要运行"git update index…"就可以使用git 1.7.9.5使更改生效。
- 已确认。@Jeffreymartinez是对的。我不需要在OSX上运行带有Git版本1.8.3.4(AppleGit-47)的更新索引。
- 如果已经对文件进行了更改,现在希望忽略该文件,则只需使用git update index。如果在进行更改之前进行了更改排除,则无需进行更改。
- 虽然这会阻止文件在提交期间显示为已更改,如.gitignore,但与被忽略的文件不同,如果执行git reset--hard,文件仍将重置回repo版本。
- 我需要在Git版本2.1.3 MacOSX上运行更新索引
- 是否有任何方法可以让一些全局忽略项应用于我的所有项目?
- 根据stackoverflow.com/questions/23097368/&hellip;和stackoverflow.com/questions/13630849/&hellip;,skip-worktree可能比assume-unchanged更受欢迎。
- @PJC:在这里查找用户希望Git在所有情况下忽略的模式
- 对于目录中的所有文件:git update-index --assume-unchanged mydir/**/*.*。
- 当您在git pull中有一个文件与您在本地忽略的文件同名时会发生什么?
- 这不适用于未跟踪的文件。(OSX上的Git 2.13.5)
- 你们总是说,如果有未跟踪的更改,就必须运行更新索引,但我从未发现如此。git状态在编辑.gitignore或.git/info/exclude后立即停止显示文件
- 请不要这样使用assume-unchanged:"假设不变不应该被滥用为忽略机制。它是"我知道我的文件系统操作很慢。我向Git保证我不会改变这些路径……特别是,这不是一个承诺……如果Git可以确定一个路径,Git将始终认为这些路径是未修改的……已经更改,而不会产生额外的lstat(2)成本,它保留报告路径已被修改的权利(因此,git commit -a可以自由地承诺更改)。'
- 谢谢你的回答!我有个问题要问你。我试图从本地笔记本文件系统中删除一个目录./grids/,而不影响远程存储库。我把grids/*添加到.git/info/exclude文件中,并尝试用git rm file_name删除该目录中的一个文件。但是,删除操作仍然提交到存储库中。我是做了什么错事还是删除不起作用?
更新:考虑改用git update-index --skip-worktree [...],谢谢@danshumway!请参阅Boralid对这两个选项的差异的解释。
旧答案:
如果需要忽略对跟踪文件的本地更改(我们对配置文件进行了本地修改),请使用git update-index --assume-unchanged [...]。
- 这是唯一有效的!谢谢。
- 只是需要注意的是,我在$g it_dir/info/exclude中添加了一个文件(例如,my file.php),然后必须运行git update-index --assume-unchanged my-file.php才能开始被忽略。谢谢你的小费!
- 撤销:git update-index --no-assume-unchanged my-file.php。
- 是的,这就是我要找的,THX!
- 仅作澄清:假设跟踪文件(存在于报告中)未更改…OP要求提供未跟踪的文件,在这种情况下,您需要的是.git/info/exclude(以避免污染经常共享和跟踪的.gitignore)
- 你救了我一天。
- @Florian Sesser是否可以在单个命令中对整个文件夹或多个文件执行此操作?
- 根据stackoverflow.com/questions/23097368/&hellip;的说法,这被认为是不安全的,如果不小心的话,您的文件仍可能被提交。它的目的是作为一个性能辅助,而不是作为一个简单的解决方案这个问题。
- 天哪,我在丹舒威的名声可能是因为我的回答是错误的。但是,我仍然没有看到另一种机制来阻止Git在我更改索引文件时对我进行窃听。另外,请考虑您的评论是否也与李乔希的回答有关。
- 博雷利德是我在网上找到的最完整的答案,所以在这一点上你和我有着相同的信息。这似乎是一个很常见的误解,部分原因是原始的git文档将其列为一种可行的方法。据我所知,相当合理比例的网络并没有意识到,例如,每当您提取文件的新版本时,这一点就会被关闭。
- 在阅读你的最新消息之前,我冲到了--assume-unchanged。我和--no-assume-unchanged解了套,然后做了--skip-worktree的……我不在吗?
- @尼古拉斯米亚里,是的,清楚了。
将以下行添加到.gitconfig文件的[alias]部分
1 2 3
| ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep"^[[:lower:]]" |
号
现在可以使用git ignore my_file忽略对本地文件的更改,使用git unignore my_file停止忽略更改。git ignored列出了被忽略的文件。
这个答案来自http://gitready.com/intermediate/2009/02/18/temporary-ignoring-files.html。
- 投票赞成简单生活和git ignored!
- "!git ls文件-v grep"^[[:lower:]]"-您是否知道如何在Windows命令上执行此操作?
- 安装一个真正的shell(例如babun提供bash或zsh);)我知道你的感受,但是我最近从Windows切换到了Linux,我再也不会使用cmd了。
您有几个选项:
- 在工作目录中保留一个脏的(或未提交的).gitignore文件(或使用topgit或其他此类修补工具自动应用该文件)。
- 如果这是特定于一棵树,则将排除项放在$GIT_DIR/info/exclude文件中。
- 运行git config --global core.excludesfile ~/.gitignore并将模式添加到~/.gitignore中。如果要忽略所有树上的某些模式,则应用此选项。例如,我将它用于.pyc和.pyo文件。
此外,请确保您使用的是模式,而不是显式枚举文件(如果适用)。
- 我认为你需要git config --global来在全球范围内设置选项。
- 真的,谢谢!
- 实际上,只需将.gitignore添加到.gitignore;)!
我想你在找:
1
| git update-index --skip-worktree FILENAME |
忽略本地更改
下面是http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/有关这些解决方案的更多说明!
- 在这个问题上,--skip-worktree和--assume-unchanged之间有一个相关的讨论。
您可以安装一些Git别名以简化此过程。这将编辑您的.gitconfig文件的[alias]节点。
1 2 3
| git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep"^S"' |
。
为您安装的快捷方式如下:
- 埃多克斯1〔18〕
- Git会假装它在config.xml上看不到任何变化-防止您意外地提交这些变化。
- 埃多克斯1〔20〕
- Git将继续确认您对config.xml所做的更改-允许您再次提交这些更改。
- 埃多克斯1〔14〕
- Git将以上面描述的方式列出您"忽略"的所有文件。
我是通过引用Phatmann的答案来构建这些模型的——它给出了同一个--assume-unchanged版本。
我现在的版本使用--skip-worktree忽略本地更改。有关差异的完整解释,请参见Borealid的回答,但本质上,--skip-worktree的目的是让开发人员在不承担更改风险的情况下更改文件。
这里显示的git ignored命令使用git ls-files -v并过滤列表以显示以S标记开头的条目。S标记表示状态为"跳过工作树"的文件。有关git ls-files显示的文件状态的完整列表:请参阅git ls-files上-t选项的文档。
- 这不适用于未跟踪的文件:<(OSX上的Git2.13.5)
- 是"!"应该在'!git ls-files -v | grep"^S"'吗?这个命令对我来说不起作用。如果把它取下来,效果会很好。
- Git别名中的感叹号告诉Git运行外部命令,而不是Git子命令。我把它放进去是因为我需要一个shell管道,所以我需要从外部调用git。我刚试着去掉感叹号(根据你的建议),但这对我不起作用。我得到了Expansion of alias 'ignored' failed; 'git' is not a git command。这是有道理的;如果没有感叹号:git将命令别名为git git ls-files …。
- 谢谢你的解释。我不熟悉git别名,只是在生成别名之前在shell中运行以进行测试。
- 回答得很好。
- 这是一个绝妙的解决方案。因为git跟踪每个目录,所以当您运行上述别名git ignore 时,它只适用于该目录。当您最终想要对该文件进行更改并提交并推送到远程时,只需使用方便的git unignore 临时开始再次跟踪它!谢谢!
您可以简单地将.gitignore文件添加到主目录,即$HOME/.gitignore或~/.gitignore。然后告诉Git将该文件与命令一起使用:
1
| git config --global core.excludesfile ~/.gitignore |
这是一个普通的.git ignore文件,在决定忽略什么时,git引用该文件。因为它在您的主目录中,所以它只适用于您,不会污染任何项目.gitignore文件。
多年来,我一直使用这种方法,取得了很好的效果。
- 不适合我。
- 谢谢,@ericchen。我已经更新了答案;尝试一下,然后使用git check-ignore 进行验证。如果对你有用的话。
- 它只对我起作用,没有=:git config --global core.excludesfile ~/.gitignore。
- 你是对的,@e.sudin-回答正确。
- 我把一个.gitignore文件放在home目录下,告诉git使用这个文件,然后删除了我想在本地解压的文件。但是,在我推送更改之后,远程存储库也删除了这些文件。我做错什么了吗?
- 哇,@xyz;.gitignore是关于忽略本地目录中存在的文件。您应该做的是git rm --cached,它将它们从回购中删除,但将它们留在本地。您应该能够使用git reset --soft HEAD^之类的工具返回到以前的提交,以撤消该提交并恢复文件。这就是Git的美妙之处:它仍然存在于你的Git历史中。
如果您的repo还没有.gitignore文件,那么一个简单的解决方案是创建一个.gitignore文件,并在其中将.gitignore添加到要忽略的文件列表中。
- 如果团队随后想要添加一个gitignore怎么办?这还管用吗?听起来是个糟糕的主意,甚至不应该奏效。
- 这家伙的回答让我很困惑。不可能有人这么做。