题 如何配置git以在本地忽略某些文件?


我可以在本地忽略文件而不会污染其他人的全局git配置吗?我在我的git状态下没有跟踪文件是垃圾邮件但是我不想为我在本地分支机构中的每个小随机未跟踪文件提交git配置更改。


959
2017-11-18 01:36


起源




答案:


相关的Git文档

特定于特定存储库但不需要与其他相关存储库共享的模式(例如,存储在存储库中但特定于一个用户的工作流的辅助文件)应该进入 $GIT_DIR/info/exclude 文件。

.git/info/exclude 文件格式与any相同 .gitignore 文件。另一个选择是设置 core.excludesFile 到包含全局模式的文件的名称。

请注意,如果您已经有非分段更改,则必须在编辑ignore-patterns后运行以下命令:

git update-index --assume-unchanged [<file>...]

注意 $GIT_DIR:这是一个使用的符号  git手册只是为了指示git存储库的路径。如果设置了环境变量,那么它将覆盖您所在的任何回购的位置,这可能不是您想要的。


1306
2017-11-18 01:38



请注意,确保运行 git update-index --assume-unchanged [<file>...] 在添加到排除文件后。直到那时才会收到更改。 - tollmanz
我不需要运行'git update-index ...'来使更改生效,使用git 1.7.9.5。 - Jeffrey Martinez
如果您已经对文件进行了更改并且现在希望忽略它,则只需要使用git update-index。如果您在进行更改之前更改排除,则没有必要。 - Brady Emerson
虽然这会阻止文件在.gitignore等提交期间显示为已更改,但与忽略的文件不同,如果执行git reset --hard,文件仍将重置为repo版本。 - Brady Emerson
每 stackoverflow.com/questions/23097368/... 和 stackoverflow.com/questions/13630849/..., skip-worktree 可能会更喜欢 assume-unchanged。 - danShumway


更新:考虑使用 git update-index --skip-worktree [<file>...] 相反,谢谢@danShumway!看到 Borealid对两种选择的区别的解释


老答案:

如果您需要忽略对跟踪文件的本地更改(我们对配置文件进行了本地修改),请使用 git update-index --assume-unchanged [<file>...]


375
2018-01-22 15:39



这是唯一有效的!谢谢。 - Adam Grant
请注意,我在$ GIT_DIR / info / exclude(例如my-file.php)中添加了一个文件然后不得不运行 git update-index --assume-unchanged my-file.php 因为它开始被忽略谢谢你的提示! - tollmanz
要撤消它: git update-index --no-assume-unchanged my-file.php - Ray
只是为了澄清:假设 - 未更改的是跟踪文件(存在于repo中)... OP要求UNtracked文件,在这种情况下 .git/info/exclude 是你想要的(避免污染经常共享和跟踪的.gitignore) - dyodji
根据 stackoverflow.com/questions/23097368/... 这被认为是不安全的,如果您不小心,您的文件仍可能被提交。它旨在作为一种性能辅助,而不是解决这个问题的万无一失的解决方案。 - danShumway


将以下行添加到.gitconfig文件的[alias]部分

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/temporarily-ignoring-files.html


129
2017-08-19 15:21



投票支持简单的生活和 git ignored ! - Cheney
“!git ls-files -v | grep”^ [[:lower:]]“ - 你知道怎么在windows cmd上做这个吗? - Haohmaru
安装一个真正的shell(例如Babun提供bash或zsh);)我知道你的感受,但我最近从Windows切换到Linux,我再也不会使用cmd了。 - Xerus


你有几个选择:

  • 留下脏(或未提交) .gitignore 在你的工作目录中的文件(或使用自动应用它 topgit 或其他一些这样的补丁工具)。
  • 把你的排除在 $GIT_DIR/info/exclude 文件,如果这是特定于一棵树。
  • git config --global core.excludesfile ~/.gitignore 并为您的模式添加模式 ~/.gitignore。如果要忽略某些模式,则此选项适用 所有 树木。我用这个 .pyc 和 .pyo 例如,文件。

此外,如果适用,请确保使用模式而不是显式枚举文件。


90
2017-11-18 01:45



我想你需要 git config --global 全局设置选项。 - Josh Lee
的确,谢谢! - Emil Sit
实际上,只需将.gitignore添加到.gitignore;)! - Dominik George


我想你正在寻找:

git update-index --skip-worktree FILENAME

忽略局部变化

这里的 http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ 这些解决方案的更多解释!


41
2017-07-11 06:38



之间有相关的讨论 --skip-worktree 和 --assume-unchanged 在 这个问题 - Merwer


你可以安装一些 git别名 使这个过程更简单。这编辑了 [alias] 你的节点 .gitconfig 文件。

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"'

这个安装的快捷方式如下:

  • git ignore config.xml
    • git会假装它没有看到任何变化 config.xml  - 防止您意外地提交这些更改。
  • git unignore config.xml
    • git将继续确认您的更改 config.xml  - 允许您再次提交这些更改。
  • git ignored
    • git将以上述方式列出您“忽略”的所有文件。

我通过参考建立了这些 帕特曼的回答  - 提出了一个 --assume-unchanged 版本相同。

我目前使用的版本 --skip-worktree 忽略当地的变化。看到 Borealid的答案 对于差异的完整解释,但基本上 --skip-worktree的目的是 供开发人员更改文件而不存在提交更改的风险

git ignored 这里介绍的命令用途 git ls-files -v,并筛选列表以显示以。开头的条目 S 标签。该 S tag表示状态为“skip worktree”的文件。有关显示的文件状态的完整列表 git ls-files:请参阅文档 -t 选项 git ls-files


31
2017-08-22 18:27



这对于未跟踪的文件不起作用:<(osx上的git 2.13.5) - Terra Ashley
是个 '!'应该在 '!git ls-files -v | grep "^S"'?该命令对我来说不适用于那里..并且似乎工作正常,删除它。 - Tiris
git别名中的感叹号告诉git运行一个 外部命令而不是一个 git子命令。我把它放入因为我需要一个shell管道,所以我需要从外部调用git。我只是尝试删除感叹号(根据您的建议),但确实如此 不 为我工作。我明白了 Expansion of alias 'ignored' failed; 'git' is not a git command。这是有道理的;没有感叹号:git别名你的命令 git git ls-files …。 - Birchlabs
感谢您的解释。我不熟悉git别名,只是在创建别名之前在shell中运行以进行测试。 - Tiris
优秀的答案。 - Michael Trouw


您只需将.gitignore文件添加到您的主目录,即 $HOME/.gitignore 要么 ~/.gitignore。然后告诉git使用该命令:

git config --global core.excludesfile ~/.gitignore

这是一个正常的.gitignore文件,git在决定忽略什么时引用它。由于它位于您的主目录中,因此它仅适用于您,并且不会污染任何项目.gitignore文件。

多年来我一直在使用这种方法,效果很好。


24
2017-10-14 12:58



对我不起作用。 - Eric Chen
谢谢,@ EricChen。我已经更新了ansswer;试一试,然后再使用 git check-ignore <file-name> 核实。 LMK,如果它适合你 - JESii
它只对我有用而没有 =: git config --global core.excludesfile ~/.gitignore - E. Sundin
你是对的,@ E.Sundin - 修正了答案。 - JESii


别忘了用@joss lee回答承认一个事实。

    git update-index --assume-unchanged directory/

注意最后的正斜杠(/)。


2
2018-02-07 13:26



这应该是评论,而不是答案! - Yassine El Badaoui


如果您的repo还没有.gitignore文件,那么一个简单的解决方案是创建一个.gitignore文件,并在其中添加 .gitignore 到要忽略的文件列表。


0
2017-08-08 21:34



如果团队想要添加以后添加gitignore怎么办?这甚至有用吗?听起来像一个可怕的想法,喜欢甚至不起作用的东西。 - Bjorn Tipling
这家伙的回答让我心烦意乱。没有人这样做。 - Martyn Chamberlin