我试图将韩国文件(或其他语言)添加到gitignore中,但是没有用
.gitignore
#ignore 예제파일/ (=exmapleFile/)
예제파일/
有什么建议吗?
答案 0 :(得分:0)
iBug's comment具有完成这项工作的关键之一。另一个是要确保文件未跟踪。
索引(也称为暂存区,有时也称为缓存)控制文件是被跟踪还是未被跟踪。索引也是Git在进行新提交时使用的索引,因此一旦创建它,索引中的每个文件都会进入您进行的 next 提交。要查看索引中每个文件的列表及其暂存信息,请使用git ls-files --stage
(请注意,这可能是一个很长的列表!):文件的路径名出现在每行输出的末尾。 / p>
Git报告一个未跟踪文件,当它在扫描目录的过程中遇到一个文件,该文件的路径名是(a)尚未在索引中并且(b)不在其中列出时忽略或排除文件。 (这里对目录有一些特殊处理,但让我们留待以后使用。)
换句话说,索引中的任何文件都会被跟踪。索引中 not 的文件未跟踪,某些未跟踪的文件也将被忽略。至关重要的是,跟踪文件永远不会被忽略。
对于具有简单ASCII样式名称(例如README.txt
或Documentation/RelNotes/2.9.5.txt
)的文件,路径名非常明显。它被编码为字节字符串:R
或README
中的RelNotes
是一个值为82的字节(无论如何都是十进制:十六进制为0x52或八进制为0122)。但是对于其他字符,例如schön中的ö或可agréable中的é,或者当然是您的had제I(我必须在这里剪切粘贴):),编码存在问题。
Git选择假定所有文件名均以UTF-8编码。您的操作系统可能会在内部选择其他编码方式(例如Windows在其许多文件系统中使用UTF-16),但是Git假定使用UTF-8,它具有许多优点,包括不需要字节序标记(BOM)。这不能解决所有问题-规范化仍然存在问题-但可以为我们提供对.gitignore
文件的答案。
(Git在索引中也使用此UTF-8形式。)
当Git读取一个.gitignore
文件时,它将以字节流的形式打开,该文件流应包含每个文件名的UTF-8编码,并以换行符终止。然后,当Git读取目录以从操作系统中提取文件(或子目录)名称时,Git会将这些名称转换为UTF-8字符串。如果这些文件名表示未跟踪的文件,则Git将比较.gitignore
文件每一行中生成的UTF-8字符串与UTF-8编码的字符串。
如果UTF-8编码的字符串匹配,则忽略未跟踪文件的名称(或者,如果前缀为!
,则不受跟踪文件的名称,因为当然all the usual rules适用)。
如果.gitignore
文件的内容不是UTF-8编码的字符串,则忽略尝试将失败,因为예제파일的UTF-8表示形式(例如,Python中的b'\xec\x98\x88\xec\xa0\x9c\xed\x8c\x8c\xec\x9d\xbc'
)将与相同字符的UTF-16LE表示形式不匹配:
>>> fn = b'\xec\x98\x88\xec\xa0\x9c\xed\x8c\x8c\xec\x9d\xbc'
>>> fn
b'\xec\x98\x88\xec\xa0\x9c\xed\x8c\x8c\xec\x9d\xbc'
>>> fn.decode('utf-8')
'예제파일'
>>> fn.decode('utf-8').encode('utf-16le')
b'\x08\xc6\x1c\xc8\x0c\xd3|\xc7'
Git在存储库中仅存储个文件。这在目录(必须存在以保存文件)和文件本身之间造成一些压力。副作用是您不能在Git提交中存储 empty 目录(请参见How can I add an empty directory to a Git repository?),而另一个问题是使用.gitignore
。
操作系统用于查找 文件的功能通常要求您先查看目录(如果喜欢该隐喻,则为“文件夹”)。该目录在文件系统中有一个名称。 Git将按名称打开目录,并一次读取其内容。每个条目将列出文件名或另一个目录名。 Git可以检查每个这样的文件名(将其与父目录的名称和斜杠结合起来,例如给dir/README.txt
),然后对索引(以查看是否被跟踪)进行索引(如果没有被跟踪),则对所有忽略列表(以查看Git是应该抱怨还是忽略它)。
但是在目录内搜索相对较慢。假设Git有一个a/b/c/d
之类的路径代表一个目录。 Git可以并且确实首先在索引中查找以查看a/b/c/d
中是否已经跟踪了任何文件。如果是这样,Git 必须读取目录。但是,如果没有,Git现在可以检查所有忽略列表,以查看a/b/c/d
本身是否被忽略。
如果忽略a/b/c/d
,则不会强制Git读取其内容!如果a/b/c/d
中有数百万个文件(无论是否在子目录中),这将节省大量时间。因此,Git也这样做。如果Git从未在内部 a/b/c/d
中查找,它将永远不会在 a/b/c/d
中找到任何未跟踪的文件。这就是为什么在某些情况下必须显式 un-ignore 的原因:强制Git在内部中查找未跟踪的文件。
(有人可能会认为.gitignore
中的列表类似:
a/b/c/d
!a/b/c/d/e/important.file
足以告诉Git:是的,忽略a/b/c/d
中的所有内容,但仍在d
内查找d/e
,随后查找d/e/important.file
< / strong>,因为您将必须在其中查看以忽略这样的文件。 Git有时会变得很聪明,但从历史上看并不是这样。因此,此规则是将其列出为:
a/b/c/d/*
!a/b/c/d/e
a/b/c/d/e/*
!a/b/c/d/e/important.file
会覆盖a/b/c/d/e
的“忽略一切”规则:a/b/c/d
本身不会被忽略,因此Git打开并读取它。然后,除非显式地a/b/c/d/any
被不被忽略,否则e
被忽略。因此,Git打开a/b/c/d/e
并进行读取。 a/b/c/d/e
中的任何内容都将被忽略,important.file
除外。)