如何使Git忽略文件而不使用.gitignore?

215

由于外部奇怪的限制,我无法修改我的存储库中的.gitignore文件。除了修改.gitignore文件,是否有一种方法可以忽略文件和目录?即使是全局解决方案,例如将应用于我所有的存储库的全局配置。

9个回答

248

如果您可以修改.git/info/exclude,您可以将相同的规则放在那里。但是该文件仅存在于您的本地存储库中。


1
听起来这可能是你最好的选择;它可以让你从本地仓库中排除文件。 - Abizern
1
这个在子模块中如何工作?子模块中没有.git目录... - zakdances
17
一个子模块的.git文件夹实际上位于父仓库/.git/modules/子模块名称。所以你需要编辑父仓库/.git/modules/子模块名称/info/exclude文件。 - Kara Brightwell
1
这个问题我认为可以给出一个快速简短的答案。谢谢! - JayKandari
在本地 Git 中排除文件而不将其添加到 .gitignore 的最佳答案 :) - owenizedd
3
然而,如果您想忽略已被 Git 跟踪的文件,则此方法无效。(原文链接) - Desko27

241
不要忘记,根据 gitignore ,Git在考虑不同的“忽略模式源”时有一个优先级顺序:
  • 从支持它们的命令行中读取的模式。
  • 从与路径相同目录中的.gitignore文件或任何父级目录中读取的模式,其中高层文件(直到根目录)中的模式会被低一级目录中的模式重写,直到包含文件的目录。
  • 从文件$GIT_DIR/info/exclude中读取的模式。
  • 从由配置变量core.excludesfile指定的文件中读取的模式。

后两者可能是你问题的解决办法,但是:

  • 它们无法在远程存储库中复制
  • 它们的模式可以被其他来源覆盖

(另请参阅SO question


另外两个解决方案涉及更新索引(git update-index):

但是,当您切换到另一个分支或运行git pull时,该“忽略”状态可能会被重置。因此有另一个选项:

两者之间的区别在"Git - 'assume-unchanged'和'skip-worktree'之间的差异"中有解释。


你可以使用update-index --assume-unchanged命令,参见https://dev59.com/uHRB5IYBdhLWcg3wWF8H#25253144。 - Elijah Lynn
1
@ElijahLynn 当然可以。你还可以使用 update-index --skip-work-tree 命令。我已经编辑了答案,添加了一些链接到我以前的回答,说明这两个 update-index 命令的用法。 - VonC

52

有三种方法可以告诉GIT忽略哪些文件:

  • .gitignore文件
  • $GIT_DIR/.git/info/exclude
  • 通过设置core.excludesfile指定的文件

后两种方法可以解决您的问题。

更多信息请参见gitignore(5)


12
我曾遇到过类似的情况,所以我添加了我喜欢的解决方案,但我没有看到这个方案被提到。在这种情况下,git update-index --assume-unchanged 的问题是您无法对未跟踪的文件执行此操作。您说:

我不能修改我的仓库中的.gitignore文件。

我理解您的意思可能是您无法将任何更改推送到远程的.gitignore。如果是这种情况,您可以将未跟踪的文件添加到本地的.gitignore中,然后执行git update-index --assume-unchanged .gitignore,以便您对.gitignore的更改从不被推送。现在,您正在忽略(可能是)未跟踪的文件,并且不会影响远程的.gitignore文件。

这正是我所处的确切情况,也是完美的解决方案。谢谢! - Gh0sT

10

另一种方法:

  • 编辑本地的 .gitignore
  • 然后运行命令git update-index --assume-unchanged .gitignore

8

忽略已跟踪文件的本地更改: git update-index --assume-unchanged my-file.php

取消忽略已跟踪文件的本地更改: git update-index --no-assume-unchanged my-file.php

来源:git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.

7
如果您只想在仓库中存储一些本地文件,并且子目录的位置很灵活,您可以将文件放在tracked_dir1/tracked_dir2/untracked_dir/中,然后添加一个tracked_dir1/tracked_dir2/untracked_dir/.gitignore文件,内容如下: * 即可。
$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

1

0

使用vim或emacs修改.git/info/exclude对我来说很有效。

注意@Desko27的评论,然而,如果您想忽略已经被Git跟踪的文件,则此方法不起作用。

因此,在跟踪之前尽早忽略文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接