.gitignore与.gitattributes的区别

13

假如我在我的 .gitignore.gitattributes 文件里都有 *.pdf,Git 会如何行动并优先考虑哪一个?它会忽略 PDF 文件还是将其存储为 LFS?


1
请阅读标签的文本。lfs 不是用于 Git 大文件存储的。 - crashmstr
2
我并不认为这个问题不清楚;它只是询问由于 .gitignore 而被忽略的文件是否仍然会被 git LFS(根据 .gitattributes 文件)考虑。简而言之,答案是否定的,但我认为这个问题不应该被关闭! - Jonathan H
2个回答

19

.gitignore 告诉 git 在特定路径下默认不关注未跟踪的文件。

.gitattributes 告诉 git 修改如何对于特定路径下的文件执行某些操作(如果/当执行该操作时)。为了使 git 尝试执行这些操作,通常您至少需要尝试开始跟踪该文件 - 当然,在 LFS 使用属性的情况下是这样的。

在这两种情况下,“在给定路径”也可以意味着“匹配给定模式”。因此不存在冲突或优先级的问题;我们只需要注意每个问题的含义。如果将 *.pdf 放入 .gitignore 中,并使用 .gitattributes 为 LFS 跟踪设置 *.pdf 属性,则:

  • 默认情况下,未跟踪的 PDF 文件将被 Git 忽略。

  • 要将新的 PDF 文件添加到索引中,您需要使用 git add -f 覆盖忽略规则

  • 一旦一个 PDF 文件存在于特定路径中,该路径就不再受忽略规则的控制

  • 您添加的任何 PDF 文件都将根据 .gitattributes 进行 LFS 管理

  • 已在仓库中的任何 PDF 文件(不受忽略规则影响)应该由 LFS 管理,尽管如果在 .gitattributes 条目之前提交,则可能不会。

因此,在这种设置中,即使有人覆盖了忽略规则,LFS 也是保护措施,以防止 PDF 文件使您的仓库数据库爆炸。也许这意味着“有一两个 PDF 文件我们确实要跟踪;但其他 PDF 文件可能出现在工作树中,我们通常不想要它们。”


3

.gitignore 是忽略那些没有使用 git add 添加的 未跟踪 文件的文件;.gitattributes 则是用于已跟踪的文件。也就是说,一个 PDF 文件可以通过 .gitattributes 进行处理,而另外两个则可以被忽略(这只是一个例子)。


1
filter 属性控制文件如何进入索引 - 包括当您首次尝试添加它们时。因此,说属性是用于跟踪的文件有点误导人。更准确地说,属性影响 git 如何处理给定路径下的文件,如果它们被处理;如果文件被忽略和未跟踪,则默认情况下 git 首先不会尝试处理它。 - Mark Adelsberger
1
@MarkAdelsberger:我不知道,我可以理解为什么有人会这么说,但是如果git add在添加文件时(在此期间它遵守输入端的“干净”过滤器),该文件同时被跟踪,而过滤器正在运行。我想这取决于你是否将“将已清理版本添加到索引”视为“先清理,然后添加”还是“在清理时添加”。 :-) - torek
@torek - 嗯,那是真的...这就是为什么我只说我认为它稍微有点误导 :) - Mark Adelsberger

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