Git的.gitattributes文件能将所有文件视为二进制文件,除了一些例外吗?

26

我有一个特殊的需求,希望git将大多数文件扩展名视为二进制文件,只有少数例外。

我想将所有文件扩展名都视为二进制文件,例如.pdf .doc .xls等,除了纯文本文件如.txt .rb .py等。

我尝试像下面这样配置.gitattributes来看看它如何工作:

# cat .gitattributes 
* binary
*.txt text

我一开始认为配置文件中的顺序很重要,但似乎并不是。使用上述配置后,所有文件仍然被视为二进制。

有没有一种方法可以通过配置 .gitattributes 文件或任何其他方式来将所有文件都以同一种方式处理,即作为二进制文件,除了一些例外情况?

更新1:

我尝试了下面描述的 .gitattributes,它有效!

# cat .gitattributes 
*.txt crlf diff
* binary


# git diff
diff --git a/file b/file
index d929b94..bee5cb1 100644
Binary files a/file and b/file differ

diff --git a/file.txt b/file.txt
index 632ae98..93d22b0 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,3 @@
 Hey this is a .txt file
+Adding another line
+A new line

更新2:

我认为crlf和text是相同的,即下面两个.gitattributes配置是相同的:

# cat .gitattributes 
*.txt crlf diff
* binary

# cat .gitattributes 
*.txt text diff
* binary
2个回答

28

binary是一个宏,用于设置属性crlf和diff(实际上是取消它们的设置)
请参阅《使用属性宏》来自.gitattribute手册页

一旦设置或取消了属性,就无法通过后续规则更改。

因此,您可以尝试:

* -text
*.txt crlf diff

这样,对于*.txt文件设置的crlfdiff将不会被二进制宏取消,而对于所有其他文件,这些设置将被取消。

对于LF或自动:

*.txt text eol=lf
#
*.txt text=auto

根据2009提交的b9d14ff,规则应该按照以下顺序:

  • 从更一般的规则开始
  • 到更具体的规则为止。
    (“后面的行会覆盖前面的行”)

2
一旦属性被设置或取消,就不能被后续规则更改。非常有用的信息!谢谢。 - caleban
1
@caleban:是的,gitattribute 手册的“EXAMPLE”部分(http://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_example)很好地说明了这个规则。 - VonC
那个部分对我来说很陌生,抽象得让我一开始看不懂。现在我懂了。 - caleban
3
手册中还提到:“当有多个模式与路径匹配时,后来的行将覆盖先前的行。这种覆盖是针对每个属性进行的。该模式匹配路径的规则与.gitignore文件中的规则相同;请参见gitignore(5)”,这段话在“描述”部分的中间。这意味着通配符星号应该放在第一位,然后再进行覆盖。星号在顶部可以正常工作,但反过来不行,我是否误解了你的帖子? - Matt
它实际上不起作用,因为*二进制无法用*.txt text = auto覆盖,您可以自行检查。但是我已经用-text替换了binary - Alex Zhukovskiy

3

git没有"二进制"和"文本"文件的概念。它被定义为一组属性,这些属性指定了我们应该如何进行合并、差异、CR/LF转换、处理空格、应用过滤器以及无数其他事情。

binary和类似于

*.o binary
的语法实际上是基于宏的,即binary是一个扩展到许多不同属性的宏,这些属性指定了合并、差异、CR/LF处理等方面的信息。

据我所见,没有text宏。 binary扩展为-crlf -diff,因此禁用二进制并返回到文本样式处理似乎是crlf diff


1
现在肯定已经定义了一个文本宏:http://git-scm.com/docs/gitattributes#_using_attribute_macros - skolima

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