【问题标题】:How to tell .gitignore to ignore all subdirectories regardless of their name?如何告诉 .gitignore 忽略所有子目录而不考虑它们的名称?
【发布时间】:2023-02-04 04:48:03
【问题描述】:

我正在使用一个遗留应用程序,每次新用户登录时都会在源目录中创建一个新的子目录。直到现在,它还没有受到源代码控制,所以我将它添加到 Git 并推送到我们公司的存储库 - -源代码加上几百个子目录。现在,每次我对代码进行更改并部署到生产环境时,我都必须首先git add自上次提交以来创建的所有子目录,然后在我可以下拉之前提交这些子目录。乏味,至少可以这样说。

所以,我的问题是,我怎样才能命令 .gitignore 对任何旧的或新的子目录,与代码相关的子目录除外?

【问题讨论】:

  • 我将从更改代码开始,使这些子目录成为一个仅用于此目的的目录。这样,将必须存储在 repo 中的文件和目录与必须存储的目录分开,解决方案很明显。 -- twitter.com/KentBeck/status/250733358307500032

标签: git


【解决方案1】:

假设您的项目目录中有以下结构

./
├── foo/
│   └── foo
├── bar/
│   └── baz
├── docs/
│   └── release/
│       └── 0.0.1
├── README.md
└── src/
    └── code

其中目录 foo/bar/ 是构建结果(您不想跟踪)的示例,它们具有不可预测的名称(或者难以在 .gitignore 中单独明确列出或具有足够窄的模式),而docs/src/ 包含(仅)要跟踪的文件(和子目录),并且您还想直接跟踪存储库根目录中的任何文件(例如当前的README.md)。

这可以通过以下 .gitignore 实现:

# Ignore all subirectories (but not files in the repo root dir):
*/

# ... except for the actual project sub dirs:
!src/
!docs/

解释

请参阅the documentation(也可通过git help gitignore获得)了解.gitignore 中的模式如何工作以及它们如何相互交互。这是上面解决方案中使用的那些:

* 匹配除斜杠(/,用作目录分隔符)以外的任何内容,因此匹配任何级别的任何目录名或文件名。这有点太宽泛了,因为我们不想忽略根目录中的文件。附加 / 使模式仅匹配目录,因此 */ 匹配任何目录(任何级别)。 (忽略目录中的文件也将被忽略,因为 Git 本身不会跟踪目录。)

所以对于*/,我们忽略了整个文件树,除了直接在根目录中的文件。

但这仍然太多了。所以我们需要有选择地撤消一些忽略。我们可以通过额外的模式来做到这一点:前缀!“否定”一个模式;任何被先前模式(此处为*/)排除的匹配文件都将再次包含在内。,因为如果排除了该文件的父目录,则不可能重新包含该文件(出于性能原因,Git 不会列出排除的目录,因此包含文件的任何模式都无效,无论它们在哪里定义。 ), docs/src/ 将只匹配顶级目录 docssrc,但不匹配 foo/src 以防存在。

这有点晦涩难懂,因此人们可能更愿意通过在前面添加 / 来明确地将否定模式锚定到根目录:

# Ignore all subirectories (but not files in the repo root dir):
*/

# ... except for the actual source dirs:
!/src/
!/docs/

【讨论】:

    【解决方案2】:

    要忽略从给定点开始的所有子目录,只需在通配符的末尾添加一个斜杠:

    */
    

    然而,对于其余部分,这不应该阻止您下拉,除非这些目录在提交后被应用程序修改。

    请注意,没有什么可以阻止您显式地将文件添加到索引然后提交它,即使它被.gitignore 忽略也是如此。在这种情况下,它将像所有其他常规文件一样被跟踪。

    您可能想使用 git rm --cached 将它们标记为在 Git 的历史记录中“从现在开始”删除,如果您仍然需要它们,则无需实际将它们从工作目录中删除。

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2012-09-23
      • 2017-12-29
      • 2017-11-12
      相关资源
      最近更新 更多