21

WinXP + mysisGit1.7

在我的 .gitignore 文件中,但仍然看不到Demos/path/to/file/file.cpp被 git 跟踪。

我有以下条目:

Demos/
!Demos/path/to/file/file.cpp

绝对路径是:c:\Project\Demos\path\to\file\file.cpp

有什么问题?请帮忙,谢谢。


编辑:

我发现 mysisGit .gitignore 在 WindowsXP 上的工作方式只能忽略某些类型的文件,然后排除一些具有相同类型的文件。例如:

*.bak
!tracking.bak
!/path/to/file/tracking2.bak

它不起作用忽略文件夹并排除该文件夹下的一些文件。下面不起作用:

/folderUnderRepoRoot/
!/folderUnderRepoRoot/tracking.cpp

也不

anyFolderNamedLikeThis/
!anyFolderNamedLikeThis/tracking.cpp
!/anyFolderNamedLikeThis/tracking.cpp

但是,我确实发现有一个例外。有一种解决方法可以在被忽略的文件夹(而不是其子文件夹)下排除文件。这行得通。

/folderUnderRepoRoot/*
/folderUnderRepoRoot/tracking.cpp

但是这种方式只在文件不在任何子文件夹中时是有限的,所以它不是那么有用。

所以我最终仍然提交了大部分源文件,即使我在跟踪其他一些大项目时只对几个文件感兴趣。这意味着有一堆文件我不会碰,但仍然需要提交它们。

这是另一个有类似问题的线程。

4

5 回答 5

24

您的.gitignore例外不起作用,因为“如果排除了该文件的父目录,则无法重新包含该文件”(source)。这是“Git 中与性能相关的怪癖”(来源)。

作为一个丑陋但实用的解决方法,对文件路径中的每个目录执行此操作:

  1. 排除目录的内容。
  2. 重新包含指向您的文件的子目录(最后,重新包含您的文件)。

您的条目将如下所示,每个两行部分对应于一个目录级别的上述两个步骤:

Demos/*
!Demos/path/

Demos/path/*
!Demos/path/to/

Demos/path/to/*
!Demos/path/to/file/

Demos/path/to/file/*
!Demos/path/to/file/file.cpp

笔记:

Demos/与问题作者尝试的不同,第一行不是。Demos是我们文件的父目录,所以我们必须在之后重新包含它——这意味着我们不必首先排除它。相反,我们首先排除它的内容: Demos/*

于 2014-08-24T18:53:37.293 回答
2

添加.gitignore如下:

folderUnderRepoRoot/**/*
!folderUnderRepoRoot/tracking.cpp

但请确保至少有一个文件从folderUnderRepoRoot文件夹添加到 git index。

于 2013-11-27T09:00:17.893 回答
2

如果只是一个文件,我通常不会修改.gitignore

以下应忽略.gitignore并允许您添加文件

git add -f Demos/path/to/file/file.cpp
于 2015-10-05T14:08:34.857 回答
0

您可以尝试将其替换为!/Demos/path/to/file/file.cpp(注意感叹号后的前导斜杠)并重试吗?

于 2010-09-08T13:04:19.703 回答
0

对我来说,情况大不相同。我试图忽略所有以“secrets”开头的文件,除了这个文件“secrets.[stage].json”,因为它只是开发人员的模板。
这不起作用


秘密*

!secrets.[stage].json


我发现这只是因为括号是一个需要转义的特殊字符所以这就是解决方案


秘密*

!secrets.[stage].json


其他特殊字符也会出现同样的问题。

因为 .gitignore 使用通配符模式来匹配文件名。你可以在这里找到 globbing 模式的文档 https://linux.die.net/man/7/glob 这对我来说比官方的 .gitignore 文档要好得多。

于 2022-02-03T18:18:02.683 回答