如何阻止. gitignore出现在未跟踪文件列表中?

我刚刚在我的新项目的根上做了一个git init

然后我创建了一个.gitignore文件。

现在,当我键入git status时,. gitignore文件出现在未跟踪文件列表中。为什么?

397347 次浏览

添加.gitignore文件并提交后,它将不再显示在“未跟踪文件”列表中。

git add .gitignoregit commit -m "add .gitignore file"git status

.gitignore文件应该在您的存储库中,因此它确实应该像git status建议的那样添加和提交。它必须是存储库树的一部分,以便可以合并对它的更改等等。

因此,将其添加到您的存储库中,它不应该是gitignored。

如果您真的想要,如果您不希望它被提交,您可以将.gitignore添加到.gitignore文件中。但是,在这种情况下,最好将忽略添加到.git/info/exclude,这是一个特殊的签出本地文件,其工作方式与. gitignore类似,但不会显示在“git状态”中,因为它位于.git文件夹中。

另见https://help.github.com/articles/ignoring-files

如果您想将被忽略的文件列表存储在Git树之外,您可以使用. git/info/不包括文件。它仅应用于您对存储库的签出。

这个想法是将特定于您的项目的文件放入.gitignore文件并(如前所述)将其添加到存储库。例如.pyc.o文件、测试套件创建的日志、一些固定装置等。

对于您自己的设置创建但不一定会出现在每个用户身上的文件(如.swp文件,如果您使用vim、隐藏的ecplise目录等),您应该使用.git/info/exclude(如前所述)。

您实际上可以将.gitignore行放入.gitignore文件中。这将导致.gitignore文件被git忽略。我实际上并不认为这是一个好主意。我认为忽略文件应该被版本控制和跟踪。我只是为了完整性而把它放在那里。

这似乎只适用于您的当前目录,以获得Git以忽略存储库中的所有文件。

更新此文件

.git/info/exclude

使用您的通配符或文件名

*pyc*swp*~

您还可以拥有一个全局用户git.gitignore文件,该文件将自动应用于您的存储区所有。这对IDE和编辑器文件(例如Vim的swp*~文件)很有用。更改目录位置以适应您的操作系统。

  1. 添加到您的~/.gitconfig文件:

    [core]excludesfile = /home/username/.gitignore
  2. Create a ~/.gitignore file with file patterns to be ignored.

  3. Save your dot files in another repo so you have a backup (optional).

Any time you copy, init or clone a repo, your global gitignore file will be used as well.

当然. gitignore文件会显示在状态上,因为它未被跟踪,而git将其视为一个美味的新文件!

然而,由于. gitignore是一个未跟踪的文件,因此当您将其放入. gitignore时,它可能会被git忽略!

所以,答案很简单:只需添加一行:

.gitignore # Ignore the hand that feeds!

到您的. gitignore文件!

而且,与8月的回应相反,我应该说. gitignore文件应该不在您的存储库中。只是碰巧它可以在,这通常很方便。这可能是真的,这可能是创建. gitignore作为. git/info/排除的替代品的原因,它没有被存储库跟踪的选项。无论如何,如何使用. gitignore文件完全取决于你。

作为参考,请查看kernel.org.上的gitignore(5)手册

只是以防万一别人有同样的痛苦,我们有。我们想排除已经提交的文件。

这篇文章更有用:使用. git/info/排除太晚

具体来说,你需要忽略一个文件实际上是使用命令git删除见gitrmhttp://www.kernel.org/pub/software/scm/git/docs/git-rm.html

你通过去测试它

git rm --dry-run *.log
(如果您说要排除所有日志文件)

如果您运行它,这将输出将是排除的内容。

然后

你通过去

git rm *.log
(或任何你想要的文件名路径/表达式)

然后在.gitignore文件中添加*.log行。

导航到git repo的基本目录并执行以下命令:

echo '\\.*' >> .gitignore

所有的点文件将被忽略,包括讨厌的.DS_Store如果你在Mac上。

如果有人已经将.gitignore添加到您的存储库,但您想对其进行一些更改并忽略这些更改,请执行以下操作:

git update-index --assume-unchanged .gitignore

来源

注意以下“问题”有时您想添加目录但这些目录中没有文件。简单的解决方案是创建一个包含以下内容的. gitignore:

*

直到您意识到该目录没有像预期的那样添加到您的存储库中。原因是. gitignore也将被忽略,从而目录为空。因此,你应该这样做:

*!.gitignore

我发现对讨厌的.DS_Store文件设置忽略的最佳位置是在.git/info/exclude文件中。

当您在IntelliJ中设置git存储库时,IntelliJ似乎会自动执行此操作。

最终用户很可能希望Git忽略“. gitignore”文件,仅仅是因为Eclipse创建的IDE特定文件夹可能与NetBeans或其他IDE不同。因此,为了保持源代码IDE的对抗性,它可以轻松地拥有一个不与整个团队共享的自定义git忽略,因为个人开发人员可能使用不同的IDE。

在我的情况下,我想排除现有文件。仅修改. gitignore不起作用。我遵循这些步骤:

git rm --cached dirToFile/file.phpvim .gitignoregit commit -a

通过这种方式,我从缓存中清理了我想要排除的文件,然后将其添加到. gitignore

.gitignore是关于忽略其他文件。git是关于文件的,所以这是关于忽略文件的。但是,由于git可以关闭文件,因此该文件需要作为列出其他文件名的机制存在。

如果它被称为.the_list_of_ignored_files,它可能会更明显一点。

打个比方,就是你不想做的待办事项列表。除非你把它们列在某个地方,否则你不会知道它们是什么“待办事项”列表。

首先,正如许多人已经说过的,你的第一(因此不应该被忽视)。让我解释一下原因。

(太长别读:提交.gitignore文件,并使用全球#0忽略IDE或操作系统创建的文件)

正如您可能已经知道的那样,Git是分布式版本管理系统。这意味着它允许您在不同版本之间来回切换(即使开发已经分散到不同的分支),它还允许多个开发人员在同一个项目上工作。

虽然当您在快照之间切换时,跟踪您的.gitignore也有好处,但提交它的最重要原因是您希望与正在处理同一项目的其他开发人员共享文件。通过将文件提交到Git中,其他贡献者将在克隆存储库时自动获得.gitignore文件,因此他们不必担心不小心提交了不应该提交的文件(例如日志文件,缓存目录,数据库凭据等)。并且如果在某个时候项目的.gitignore被更新,他们可以简单地拉入那些更改,而不必手动编辑文件。

当然,有些文件和文件夹是你想要忽略的,但它们是特定于你的,不适用于其他开发人员。但是,这些不应该在项目的.gitignore中。还有两个地方你可以忽略文件和文件夹:

  • 由您的操作系统或IDE创建的文件和文件夹应放置在全球#0中。好处是此.gitignore应用于您计算机上的所有存储库,因此您不必为每个存储库重复此操作。它不会与其他开发人员共享,因为他们可能使用不同的操作系统和/或IDE。
  • 不属于项目.gitignore或全局.gitignore的文件可以使用显式存储库排除在#2中忽略。此文件不会与其他开发人员共享,并且特定于该单个存储库

我认为在某些情况下忽略. gitignore是非常有用的。例如,当你有多个团队或一个大团队在同一代码库上工作时。在这种情况下,你需要有某些约定,其中一个约定是关于在git存储库中忽略什么。它通常是关于忽略IDE或OS创建的文件和目录,一些生成的日志等。

然而,有一种力量倾向于对.gitignore文件进行非常规的更改。不负责任的人、错误、使用的工具或其他情况可能会进一步更改.gitignore文件。

为了对此产生反作用力,我们可以这样做:

  1. 最初的. gitignore应该反映团队中的约定,
  2. 推送后,应通过添加. gitignore条目来保护. gitignore并再次推送该更改。.gitignore文件是“密封”。

密封.gitignore文件可以在本地进行更改,而不会将更改传播给团队的其他成员。但是,如果一项更改在整个团队中得到广泛同意,则可以“解封”它,更改它并再次“密封”它。这不能错误地完成,只能故意完成。

可悲的是,你不能100%保护自己免受愚蠢的影响,但这样你就尽了一切努力防止愚蠢的事情发生。

如果你有相对较小的团队和非常优秀的专业人士,这并不重要,但即使是那些人也会很高兴少担心一件事。

当你不能对基础设施设置做任何事情时,使用.git/info/exclude很酷,只是覆盖你自己的一个**而不是犯错误。

从正确和错误的角度来看,我投票支持在.gitignore文件中拥有. gitignore条目,让每个人都有在本地做任何他们想做的事情的自由,但不入侵他人。

如果您已经签入. gitignore并且想要忽略对它的修改,请查看这个答案

尝试使用此命令:

git update-index --assume-unchanged FILENAME_TO_IGNORE

要反转它(如果你想提交更改),请使用:

git update-index --no-assume-unchanged

更新

以下是如何在当前目录下列出假设不变文件目录:

git ls-files -v | grep -E "^[a-z]"

由于-v选项将使用小写字母表示“假设未更改”文件。