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

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

答案

相关的 Git 文档中

特定于特定存储库但无需与其他相关存储库共享的模式(例如,位于存储库内但特定于一个用户工作流程的辅助文件)应放入$GIT_DIR/info/exclude文件。

.git/info/exclude文件与任何.gitignore文件具有相同的格式。另一个选项是将core.excludesFile设置为包含全局模式的文件的名称。

请注意,如果您已经取消暂存更改,则必须在编辑忽略模式之后运行以下命令:

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

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

更新 :考虑使用git update-index --skip-worktree [<file>...]代替,谢谢 @danShumway!请参阅Borealid 关于这两种选择的区别的说明


旧答案:

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

将以下行添加到. 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

您有几种选择:

  • 在工作目录中保留一个肮脏的(或未提交的) .gitignore文件(或使用topgit或其他一些此类补丁工具自动应用该文件)。
  • 如果$GIT_DIR/info/exclude特定于一棵树,则将$GIT_DIR/info/exclude放入$GIT_DIR/info/exclude文件中。
  • 运行git config --global core.excludesfile ~/.gitignore并将模式添加到~/.gitignore 。如果要忽略所有树中的某些模式,则此选项适用。例如,我将其用于.pyc.pyo文件。

另外,请确保您使用的是模式,而不是显式枚举文件(如果适用)。

我认为您正在寻找:

git update-index --skip-worktree FILENAME

忽略本地更改

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

撤消使用:

git update-index --no-skip-worktree FILENAME

您可以安装一些git 别名来简化此过程。这将编辑.gitconfig文件的[alias]节点。

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 将以上述方式列出您 “忽略” 的所有文件。

我通过参考phatmann 的答案来构建这些内容,该答案给出了一个--assume-unchanged版本。

我目前使用的版本使用--skip-worktree来忽略本地更改。有关差异的完整说明,请参见Borealid 的答案 ,但是--skip-worktree的目的实质上是让开发人员更改文件而没有提交更改的风险

此处显示的git ignored命令使用git ls-files -v ,并过滤列表以仅显示那些以S标记开头的条目。 S标签表示状态为 “跳过工作树” 的文件。有关git ls-files显示的文件状态的完整列表:请参阅git ls-files-t选项git ls-files

您可以简单地将. gitignore 文件添加到主目录,即$HOME/.gitignore~/.gitignore 。然后告诉 git 使用以下命令使用该文件:

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

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

多年来,我一直使用这种方法取得了不错的效果。

为了忽略未跟踪的文件(特别是如果它们位于未跟踪的(几个)文件夹中),一个简单的解决方案是将.gitignore文件添加到每个未跟踪的文件夹,并在包含*一行中输入*然后换行。如果未跟踪的文件位于几个文件夹中,则这是一个非常简单直接的解决方案。对我来说,所有文件都来自一个未跟踪的文件夹vendor ,以上方法都可以正常工作。

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