如何在Git中忽略Go二进制文件?

10

我有一个像这样的.gitignore文件:

# no binaries
*/
!*.go/
!.gitignore
我认为 */ 表示忽略所有子目录中的所有文件(也就是每个文件),!*.go/ 表示不要忽略所有子目录中的 *.go 文件,!.gitignore 表示不要忽略 .gitignore 文件。

然而,我现在遇到的问题是:当我在子目录中创建一个新的 *.go 文件时,它现在被忽略了。

如何正确地 gitignore 所有编译后的二进制文件,但不忽略 *.go 文件?

我现在有:

**/*  
!**/*.go
!.gitignore

但它仍然忽略了ch1目录中的所有*.go文件。还有其他人有想法吗?

3个回答

11

这个命令将会忽略除了 .go 文件以外的所有文件,而且也支持子目录:

**/*
!**/*.go
!**/

你可能还想查看这个问题,它询问了非常相似的内容。


5

您需要使用:

**/*.go
**用于忽略任何文件夹中的文件,而不仅仅是当前文件夹。
在git v2.7中修复了一个小错误:

允许后面的!/abc/def覆盖同一.gitignore文件中出现的早期/abc,以便更容易地表达“忽略/abc目录中的所有内容,除了...”。


来自.gitignore文档:

完整路径名中匹配的模式中的两个连续星号(**可能具有特殊含义:

前导 **

前导 **后跟一个斜杠表示在所有目录中匹配。
例如,**/foo与文件或目录foo 任何位置匹配,与模式foo相同。
**/foo/bar匹配直接位于目录foo下的文件或目录"bar"。

尾随 **

尾随 /**匹配内部的所有内容
例如,abc/**与相对于.gitignore文件位置的目录abc中的所有文件匹配,具有无限深度。

/**/

斜杠后跟两个连续星号,然后是一个斜杠,表示匹配零个或多个目录。
例如,a/**/b匹配a/ba/x/ba/x/y/b等。


我将 !*.go 替换为 !**.*.go,但我的新的 *.go 文件仍然被忽略了。 - Julien Chien
请阅读我根据此评论添加的更新内容。 - CodeWizard
2
我已经阅读了它,并尝试应用,但没有成功。我想不要忽略*.go源文件,但忽略它们的二进制文件(没有扩展名)-还有其他提示吗? - Julien Chien
如果文件没有扩展名,除非将它们全部放在某个特定的文件夹中,否则很难排除它们。 - CodeWizard

0

默认情况下,Golang编译器将以包含.go源文件的文件夹名称命名您的二进制文件。在您的IDE中,您可以使用构建选项指定golang编译命令。在我的情况下,当我在OSX上编译我的.go源文件时,我已经指定了我的IDE运行以下命令:

"env GOOS=darwin GOARCH=amd64 go build -v -o bin/$(basename $(pwd)) && go test -v && go vet"

请注意,在我的go build中,我使用-o指定了二进制输出路径,并告诉编译器将所有二进制文件写入当前目录下的子文件夹bin/,并以项目文件夹的名称命名二进制文件。然后,在您的项目文件夹中的.gitignore文件中添加bin/*,Git将忽略bin/子文件夹中的所有文件。

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