gpt4 book ai didi

gitignore - 忽略根目录以外的其他 .gitignore 文件

转载 作者:行者123 更新时间:2023-12-05 05:45:27 29 4
gpt4 key购买 nike

我的实际问题

我希望只有目录结构根目录中的 .gitignore 文件会忽略文件,即子目录中的 .gitignore 文件不应忽略文件。

要清楚

我不想 gitignore 其他 .gitignore 文件。我希望他们致力于 git 但我不希望他们忽略其他文件。

特定用例

假设我想将样板项目结构提交给 git。假设项目结构如下所示:

project-root/

├── boilerplate/
│ ├──directory/
│ ├──some-other-directory/
│ ├──.env
└── └──.gitignore // Has a line ".env" which will ignore the .env file in this directory

├── boilerplate2/
│ ├──directory/
│ ├──some-other-directory/
│ ├──.env
└── └──.gitignore

└── .gitignore // The .gitignore in root

现在 boilerplate 目录中的 .gitignore 文件将 gitignore .env 我不想要。如何阻止嵌套的 .gitignore 文件执行操作?

我尝试了什么?

我在主 .gitignore 文件中尝试了否定 (!) 运算符。对于上面的示例结构,它等同于 !boilerplate/.env。 root 中的 .gitignore 对指定目录中的 .gitignore 文件没有任何权限。它不会覆盖它。为什么它会这样工作?有解决方法吗?

编辑:

VonC建议使用脚本自动化,但这不是问题所在。问题是,如果可能的话,如何仅使用 .gitignore 来做到这一点。

最佳答案

Now the .gitignore file in boilerplate directory will gitignore .env which I don't want.

不会。

如果 boilerplate/.env 已添加(git add --force)并提交,则对该特定 .env 文件的任何更改仍会被检测到,而不是被忽略。

OP 添加:

But when I do git status, git ignores boilerplate/.env due to boilerplate/.gitignore (which isn't commited either)

然后,是的,它将忽略所有 .env,除非它们本身就是版本。


The .gitignore in root simply doesn't have any power over the .gitignore file in the specified directory.
It doesn't override it.

接下来是 precedence rules for a .gitignore :

Patterns read from a .gitignore file in the same directory as the path, or in any parent directory (up to the top-level of the working tree), with patterns in the higher level files being overridden by those in lower level files down to the directory containing the file.


在你的情况下,我会:

  • 保持.env规则
  • 仅版本 .env.tpl 具有默认初始值的模板文件
  • 添加一个带有污点的 .gitattributes 文件 content filter driver *.tpl
  • 的脚本声明

那个涂抹脚本(例如,'script_tpl',它也可以进行版本控制)将是一个 bash 脚本(它甚至可以在 Windows 上运行,因为 Git for Windows 带有 bash.exe ):

#!/bin/bash

file="${f%.tpl}" # ex: .env.tpl => .env
if [[ ! "${file}" ]]; then cp "${f}" "${file}"; fi

我会添加一个 senv 脚本,让任何协作者使用存储库的本地克隆来执行,以便自动注册内容过滤器驱动程序。它将包括:

#!/bin/bash
DIR="$( cd "$( dirname "$(readlink -f "${BASH_SOURCE[0]}")" )" && pwd )"
# assuming the smudge script is at the root of the repository
which script_tpl || export PATH=${PATH}:${DIR}
git config --global filter.tpl.smudge 'script_tpl'

那样,任何时候你切换分支,检查 .env 是否存在的涂抹脚本,如果不存在,将创建一个(它将被所有不同的 .env 忽略)。 gitignore 文件)

关于gitignore - 忽略根目录以外的其他 .gitignore 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71389176/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com