如何在不使用.gitignore的情况下使Git忽略文件?


132

由于外部怪异的限制,我无法修改.gitignore存储库的。除了修改a之外,还有其他方法可以忽略文件和目录.gitignore吗?即使是像全局配置这样的全局解决方案也将应用于我的所有存储库。

Answers:


178

根据gitignore的描述,请不要忘记Git考虑的不同“忽略模式源”中有一个优先顺序:

  • 从命令行读取的模式支持它们。
  • 从与路径相同的目录中或任何父目录中的.gitignore文件读取的模式,较高级别文件(直至根)中的模式被较低级别文件中的模式(包括该文件的目录)覆盖。
  • 从读取的模式$GIT_DIR/info/exclude
  • 从配置变量指定的文件中读取模式core.excludesfile

最后两个可以解决您的问题,但是:

  • 它们不会为远程存储库复制
  • 他们的模式可以被其他来源覆盖

(另请参见此SO问题


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

但是,当您签出另一个分支或您时git pull,可能会重置该“忽略”状态。因此,另一个选择是:

两者之间的差异在“ Git- assume-unchanged'和' skip-worktree' 之间的差异 ”中进行了说明。


您可以使用update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn

1
@ElijahLynn当然。你也有update-index --skip-work-tree。我编辑了答案,以添加指向我的旧答案的链接,以说明这两个update-index命令。
2014年

140

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


听起来这可能是您最好的选择;让我们从本地存储库中排除文件。
阿比森

1
子模块如何工作?.git子模块中没有目录...
zakdances

10
@yourfriendzak子模块的.git文件夹实际上位于parent_repo/.git/modules/submodule_name。所以您要编辑parent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell,2015年

25

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

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

后两点可以解决您的问题。

有关更多信息,请参见gitignore(5)


5

如果您只想在存储库中有一些本地文件,并且子目录的位置很灵活,则可以将文件放入其中tracked_dir1/tracked_dir2/untracked_dir/,然后添加tracked_dir1/tracked_dir2/untracked_dir/.gitignore内容如下:

*

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>

4

我曾经遇到过类似的情况,所以我添加了我未提及的首选解决方案。git update-index --assume-unchanged在这种情况下,问题在于您无法对未跟踪的文件执行此操作。你说

我无法修改存储库的.gitignore。

我将假设您的意思是您不能将任何更改推.gitignore到原始位置。如果是这种情况,您可以做的就是将未跟踪的文件添加到local .gitignoregit update-index --assume-unchanged .gitignore这样.gitignore就不会更改您的更改。现在,您将忽略(可能是)未跟踪的文件,并且不会影响远程.gitignore文件。


3

忽略对跟踪文件的本地更改: 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.


1

其他方式:

  • 编辑本地 .gitignore
  • 然后 git update-index --assume-unchanged .gitignore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.