1

我创建了一个.gitignore文件,它一直显示在未暂存的更改区域中。

为什么 git 不会自动处理这个问题,因为这是项目(repo)的一种配置文件?默认情况下不能成为存储库的一部分吗?为什么设计中会包含这样的行为?这种设计有什么用例吗?

4

5 回答 5

5

在 git 中至少有三种忽略文件的方法:

这些设置存储在您的 git 安装/当前克隆的元数据中。它们在创建新克隆时不会被转移,因此不会在用户之间共享。

然而,人们注意到他们通常都想忽略相同的文件,并且他们想交换被忽略文件的列表。此列表随时间而变化,因此将其置于版本控制之下是合理的。而且,作为 unix 的一个原则,一切都是文件和明文,如果可能的话,你最终会得到一个 .gitingore 文件。既然您有一个存储库和一个需要在存储库的所有用户之间进行版本控制和交换的文件 --- 为什么不简单地将文件添加到存储库?这样你就不需要特殊的逻辑和隐藏的配置文件,一切正常。

这是在 git 中忽略文件的第三种方法:

  • 通过 .gitignore 文件忽略它们

在我个人看来,.gitignore 文件是让 git 很棒的东西之一。

PS:详细说明“为什么默认情况下不存在”:我不直接回答问题,但考虑这些问题可能会有所帮助:

  • 为什么默认没有添加自述文件?每个回购都应该有一个!
  • 许可证也一样?每个回购都应该有一个!
  • ...

所有这些都是强烈推荐的最佳实践,但从技术角度来看,你可以不用。并且 git 倾向于只做最低限度的工作以使事情正常进行。git 中的默认值力求合理但简约。这很好,但有时它会让初学者更难。

于 2013-07-05T16:08:34.013 回答
5

因为该文件的内容可能需要随着项目中代码的更改而更改。这意味着您希望能够存储 .gitignore 文件本身的版本历史记录以及构成项目的文件。这意味着您将使用普通的 git 命令来控制何时提交该文件。

所以 git 没有别的事可做。无论如何,您都需要使用 git 命令来正确管理提交 .gitignore (每次编辑时隐式提交 .gitignore 比在更改后立即隐式提交任何其他文件更有意义),并且做所以涵盖了跟踪文件的所有用例。所以 git 没有必要特别对待 .gitignore 。

于 2013-07-05T15:58:15.443 回答
5

除了其他答案...

如果您希望将忽略的文件作为 repo 的一部分进行跟踪,并由其他签出它的人共享,则.gitignore必须像任何其他文件一样跟踪(签入和版本化)文件。

如果您希望签入和版本化被忽略文件的列表,则将文件名添加到.git/info/excluderepo 的根目录中。该文件未签入,因此对它的更改不会继续显示为未暂存的更改。该文件是“默认情况下存储库的一部分”,但不像工作树中的文件那样进行版本控制。

于 2013-07-05T16:01:40.937 回答
4

基本上,.gitignore只是一个文件。

Git 是一个非常通用的工具,不会在没有充分理由的情况下包含任何特殊情况。并且没有充分的理由为什么.gitignore应该单独处理文件。

通过这种方式,用户可以选择是否想要一刀切.gitignore并将其签入。或者允许每个客户拥有自己的一组被忽略的文件。

于 2013-07-05T16:03:59.967 回答
3
  1. Git 希望确保您知道它要跟踪的文件,无论其类型如何。这种对进程中文件的神经质控制是 Git(或任何其他体面的 VCS)如此强大的原因。虽然最初很烦人,但git 没有对您的文件执行“魔术”是一件好事。
  2. 错误的.gitignore文件可能对存储库造成严重破坏,自动签入它们可能是灾难性的。
于 2013-07-05T15:56:28.603 回答