Git忽略.gitattributes模式

10
我有这样的目录结构:
root/
  .git
  deploy/
  Site/
    blah/
    more_blah/
      something.local
      else.development
    Rakefile
    .gitattributes

编辑:为了进一步澄清上述内容,目录名称末尾有一个/,子目录缩进在目录下方,因此blahmore_blah是目录,而Rakefile.gitattributes是文件,但这四个都是Site的子元素。


我正在Site目录中运行git-archive命令,如下所示:

git archive --format=tar --prefix=git-v0.0.1/ v0.0.1 | gzip > ../deploy/git-v0.0.1.tar.zip
但是不管我在 .gitattributes 文件中放什么样的模式,最终生成的归档文件总是包含 Rakefile 文件。我已经尝试过以下方式:
  • Rakefile
  • Site/Rakefile
  • */Rakefile
  • ./Rakefile
  • Rakefile*
  • *
没有一个能按照我的预期工作。是否有人可以指出明显但对我而言却不明显的解决方案?非常感谢您的任何帮助。
抱歉我没有表达清楚。
  • 我说我使用的“模式”似乎不起作用,但我在模式后面使用了 "export-ignore"。
  • Rakefile 不是目录,只是一个文件。
  • .gitattributes 文件成功从归档中移除了其他模式,Rakefile 不是唯一使用的模式,但是它是唯一一个不起作用的模式。无论我是单独使用还是与其他模式一起使用,都不起作用,并且放在文件中的任何位置都不行。 这不是真的,由于我已经重命名了某些文件但没有将提交与重命名一起存档,因此我似乎得到了一些良好的结果。我的错!:S
这是我的 .gitattributes 文件(位于 Site 目录中)。
Rakefile        export-ignore
*.local         export-ignore
*.development   export-ignore
*.staging       export-ignore

1
你的完整.gitattributes文件是什么样子的? - Paŭlo Ebermann
7个回答

6

我不确定这是否是常见情况,但我在尝试从源代码树中排除具有许多嵌套级别的文件夹tests时遇到了麻烦。如果我只写了以下这行到.gitattributes文件中:

tests/* export-ignore

它没有起作用,整个目录仍保留在归档中。解决方案是为所有子目录级别添加通配符:

tests/* export-ignore
tests/*/* export-ignore
tests/*/*/* export-ignore
tests/*/*/*/* export-ignore
tests/*/*/*/*/* export-ignore

这些代码使得tests目录最终从文档中消失。


2
在这种情况下,tests/** export-ignore 不起作用吗? - Manuzor
5
tests/**/*是你需要忽略任何深度的'tests'目录下的所有文件。 - ansorensen

5

我相信@Jefromi在他的评论中提供了我解决此问题所需的信息,但他太谦虚了,不愿意得到赞誉。我想保持我的接受率达到100%(完全正确),因此我将在这里给出答案:


第一次编辑:

好的,需要两件事情。仅使用--worktree-attributes无法生效,但是当我将.gitattributes文件从Site目录移动到根目录时,它就起作用了。再次提醒 Git书中暗示该文件不需要在根目录中才能工作(注意:链接失效)

...(通常是项目的根目录)


追加编辑:

即使在文档的最新版本(2.35.1)中,仍然有关于不在仓库根目录(GIT_WORK_TREE / GIT_DIR)下的.gitattributes文件的引用,例如:

不在工作树子目录中的.gitattributes文件中

Git在访问工作树中的.gitattributes文件时不会跟随符号链接。


我觉得这些文档让我有些失望(这还是头一次)。我也认为,如果.gitignore已经能够正常工作,那么必须选择文件的行为并不是你想要的。

1
感谢您提供了正确的答案来回答我的问题。其他的答案在我的情况下并没有帮助。 - Jason Dagit
链接似乎已经损坏了... - lindhe
1
@lindhe 谢谢。我尝试修复答案以考虑到这一点。 - ian

4

14
另外,请务必提交您的.gitattributes文件或使用--worktree-attributes选项进行git archive。默认情况下,它使用正在存档的树中的属性;如果这些属性只存在于工作目录中,则通常会被忽略。为了测试,您可以使用--worktree-attributes选项,确定其有效后再提交。 - Cascabel
@Jefromi - 我使用了Git书籍中的指示,但它们没有说明您必须检入文件才能使用它。 "这些特定于路径的设置称为Git属性,并且可以在一个目录(通常是项目根目录)中的.gitattributes文件或者如果您不想将属性文件提交到您的项目中,则可以在.git/info/attributes文件中设置。" 但是,现在你提出了这个问题,我看到git-archive手册建议使用--worktree-attributes选项来使其工作。我现在会尝试一下。 - ian
@Jefromi - 好的,需要两件事情。--work-attributes本身不起作用,但当我将.gitattributes文件从Site目录移动到根目录时,它就起作用了。再次强调,Git书籍暗示该文件不需要在根目录中才能工作“...(通常是您的项目的根目录)”,所以我对这些文档感到有点失望(这是第一次)。我认为,相比于.gitignore可以直接使用,必须选择该文件并不是您想要的行为。无论如何,我认为您的评论是正确的答案,如果您愿意将该评论转换为答案,我可以标记它。 - ian
无法在版本1.7.5.4中添加斜杠“/”。 - Brook

3
如果你想让git忽略一个文件,在.gitignore文件中添加该文件,而不是.attributes文件。如果你想忽略你的Rakefile文件,在你项目的根目录中的.gitignore文件内添加以下内容即可。
/**/Rakefile

如果您有多个路径,且只想忽略其中一个,请指定完整路径。

以下是如何为这些文件实现模式匹配的几个示例:

/**/*.ext

/**/some_file.ext

/some_file.ext

/some_folder/some_file.ext

/some_folder/*

2

在git版本1.7.2.5中(debian squeeze的默认版本,因此本文适用),在忽略目录时不能在末尾加上斜杠。因此,为了忽略上述问题中的deploy目录,必须使用以下行(无斜杠):

deploy        export-ignore

这与文档(man gitattributes / man gitignore)和git书籍中的描述相矛盾。gitattributes的文档引用了gitignore。有趣的是,带斜杠的目录(deploy/)可以在.gitignore文件中使用。
我没有测试过较新版本的git。

git 1.8.1.1 中不是这种情况。如果您不包括尾随斜杠,则该目录将添加到存档中。 - Cas

2

对于目录,我在使用不同版本的git时遇到了问题,因此我必须包含一个条目,既有斜杠也没有斜杠:

  • foo/bar export-ignore
  • foo/bar/ export-ignore

其中foo/bar是相对于我运行git archive的位置,但实际的.gitattributes文件除了上面提到的--worktree-attributes之外,还位于项目根目录中。


1

您是否试图将文件包含在仓库中,但不包括在由git archive创建的存档中? 如果是这样,则您的.gitattributes文件的语法是错误的。 如果不是这样,那么您不应该使用.gitattributes

要从git archive生成的归档中排除文件,应将以下内容放入.gitattrubutes中。

Rakefile export-ignore

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