如何在git中使用.gitignore文件忽略二进制文件?

例子:

$ g++ hello.c -o hello

“hello”文件是二进制文件。git可以忽略这个文件吗?


当前回答

我在GOPATH目录中创建了一个包含两个条目的.gitignore文件。

/bin
/pkg

目前,它忽略所有已编译的开发。

其他回答

.gitignore机制仅基于文件名工作,而不是基于文件内容。二进制文件是内容的属性,因此你不能要求git直接忽略二进制文件,而只能通过名称来忽略它们(正如其他人建议的那样,你可以将所有二进制文件名添加到.gitignore中,或者使用适当的命名约定)。

事实上,.gitignore处理文件名是一个重要的性能属性:Git只需要列出文件,而不需要打开和读取它们来知道要忽略哪些文件。换句话说,如果您要求Git根据文件的内容忽略文件,那么Git会非常慢。

如果你在你的.gitignore文件上执行这些命令,文件仍然出现,你可能想尝试:

git rm --cached FILENAME

之后,添加你的。gitignore,提交并推送。 我花了40分钟才明白,希望这对像我这样的新手有帮助

这是另一个使用文件的解决方案。这样,可执行脚本就不会在gitignore中结束。您可能需要更改文件输出的解释方式,以匹配您的系统。然后可以设置一个预提交钩子,以便在每次提交时调用此脚本。

import subprocess, os

git_root = subprocess.check_output(['git', 'root']).decode("UTF-8").strip()
exes = []
cut = len(git_root)

for root, dirnames, filenames in os.walk(git_root+"/src/"):
  for fname in filenames:
    f = os.path.join(root,fname)
    if not os.access(f,os.X_OK):
      continue

    ft = subprocess.check_output(['file', f]).decode("UTF-8")

    if 'ELF' in ft and 'executable' in ft:
      exes.append(f[cut:])

gifiles = [ str.strip(a) for a in open(git_root + "/.gitignore").readlines() ]
gitignore=frozenset(exes+gifiles)

with open(git_root+"/.gitignore", "w") as g:
  for a in sorted(gitignore):
    print(a, file=g)

二进制文件通常没有扩展名。如果这是你的情况,试试这个:

*
!/**/
!*.*

裁判:https://stackoverflow.com/a/19023985/1060487

只需添加hello或/hello到你的.gitignore。要么工作。