跟踪文件但将它们从 git 包中排除
Track files but exclude them from a git bundle
我有一个有点复杂的 ansible 工作流程。我有两个气隙网络。我在两个网络上开发剧本,所以我有两个由 git 管理的有点独立的 ansible 存储库。同时,大部分的playbook都可以在这两个地方使用。使事情复杂化的是,这是一种单向传输。我可以从网络A转移到B,但不能从网络B转移到A。
我有模板文件,其中包含与一个网络相关但与另一个网络无关的信息。我将其设计为文件名应该相同(以及 Jinja2 模板中的变量名)。我希望能够创建一个排除文件的 git 包,这样当我从其他网络存储库中的包中提取文件时,文件不会被覆盖。因为在模板文件中包含错误信息可能会破坏整个环境,所以我需要跟踪 Git.
中的 Jinja2 template/variable 文件
除了使用 .gitignore(因为需要跟踪文件以便我可以在紧急情况下回滚)之外,是否有人有工作流程建议或 git 命令可以帮助我完成这个?
没有完全简单的方法可以做到这一点。
从根本上说,一个文件在 Git 中 被跟踪 当且仅当它在索引中时。索引(通常,最初)是从某个提交中填充的,因此它是某个先前的提交来确定是否要跟踪文件。假设存在相似的提交集 T 和 U 除了有些文件不在提交 U[=70 中=] 在提交 T 中。那么:
git checkout any-T-sub-i-commit
导致文件在索引中(因此被跟踪),同时:
git checkout any-U-sub-j-commit
导致文件不在索引中(因此未被跟踪)。
对于像合并这样的操作,这同样适用于更一般的方式:当您处理来自集合 T 的提交时,您处理的是具有文件的提交;当您使用集合 U 中的提交时,您使用的是那些缺少文件的提交。如果将任何 Ti 提交与任何 Uj[=70= 合并] 提交,对任何此类文件的影响——无论是添加、删除还是冲突——取决于合并基础提交是在集合 T 还是集合 U,以及在提交 Ti 中对合并基础提交的那些文件的具体更改。
当然,随着文件移入或移出索引,Git 也会同时将它们复制到工作树中或从工作树中删除它们(通常要注意不要删除未保存的文件- 但 - 宝贵的数据)。因此,这意味着工作树文件将消失并重新出现,具体取决于您签出的是 T 提交还是 U 提交。
同时,让我们至少从抽象意义上看一下什么是捆绑包。捆绑的本质是它包含 至少 git fetch
或 git push
将通过网络发送的所有数据,在 git fetch
或 git fetch
之后git push
用于最小化此数据的通信过程。 (它可以包含额外的数据,这些数据将被简单地忽略。)这个最小数据包含所有必须复制的对象——带注释的标签、提交、树和 blob——加上引用名称及其值。
要从捆绑中排除一些文件集,那么,您需要只捆绑 U 提交,而不是任何 T 提交。就目前而言这很好:如果你复制了所有分支,并通过分支名称区分 T 提交和 U 提交,你可以实现这很容易。但结果是,每次您进行新的 T 提交时,您都必须进行相应的 U 提交,反之亦然。实际上,您的工作量增加了一倍。
一般适用于配置文件的标准建议也适用于此:永远不要提交任何配置。仅提交 sample 或 default 或 template 配置。 使用某种包装器来将这些示例配置转换为实际配置。 (当然,也可以提交包装器,如果它是您自己编写的东西,例如 shell 脚本或 Python 程序或其他任何东西。)您现在可以维护和版本控制这些示例/ 默认配置。克隆存储库获取样本,并从克隆更新——git fetch
,然后合并或变基——更新样本,但不触及实际配置。根据包装器的智能程度以及输出格式中可用的内容,1 它甚至可以自动检测 sample/default 输入已更改,并警告或失败任何 运行s 使用规定的工具(即包装器本身),直到更新实际配置以匹配来自 sample/default/模板配置的任何所需更改。
这仍然不是微不足道的——特别是,您可能必须编写一个包装器,并以正确的方式教育用户 运行 您的特定系统。但它与您可能实现的一样微不足道。
1在这种特殊情况下,您的输出很可能是 ansible 的 YAML 文件。这意味着您可以在评论中隐藏各种有用的 sample/default-config 信息,例如。
我有一个有点复杂的 ansible 工作流程。我有两个气隙网络。我在两个网络上开发剧本,所以我有两个由 git 管理的有点独立的 ansible 存储库。同时,大部分的playbook都可以在这两个地方使用。使事情复杂化的是,这是一种单向传输。我可以从网络A转移到B,但不能从网络B转移到A。
我有模板文件,其中包含与一个网络相关但与另一个网络无关的信息。我将其设计为文件名应该相同(以及 Jinja2 模板中的变量名)。我希望能够创建一个排除文件的 git 包,这样当我从其他网络存储库中的包中提取文件时,文件不会被覆盖。因为在模板文件中包含错误信息可能会破坏整个环境,所以我需要跟踪 Git.
中的 Jinja2 template/variable 文件除了使用 .gitignore(因为需要跟踪文件以便我可以在紧急情况下回滚)之外,是否有人有工作流程建议或 git 命令可以帮助我完成这个?
没有完全简单的方法可以做到这一点。
从根本上说,一个文件在 Git 中 被跟踪 当且仅当它在索引中时。索引(通常,最初)是从某个提交中填充的,因此它是某个先前的提交来确定是否要跟踪文件。假设存在相似的提交集 T 和 U 除了有些文件不在提交 U[=70 中=] 在提交 T 中。那么:
git checkout any-T-sub-i-commit
导致文件在索引中(因此被跟踪),同时:
git checkout any-U-sub-j-commit
导致文件不在索引中(因此未被跟踪)。
对于像合并这样的操作,这同样适用于更一般的方式:当您处理来自集合 T 的提交时,您处理的是具有文件的提交;当您使用集合 U 中的提交时,您使用的是那些缺少文件的提交。如果将任何 Ti 提交与任何 Uj[=70= 合并] 提交,对任何此类文件的影响——无论是添加、删除还是冲突——取决于合并基础提交是在集合 T 还是集合 U,以及在提交 Ti 中对合并基础提交的那些文件的具体更改。
当然,随着文件移入或移出索引,Git 也会同时将它们复制到工作树中或从工作树中删除它们(通常要注意不要删除未保存的文件- 但 - 宝贵的数据)。因此,这意味着工作树文件将消失并重新出现,具体取决于您签出的是 T 提交还是 U 提交。
同时,让我们至少从抽象意义上看一下什么是捆绑包。捆绑的本质是它包含 至少 git fetch
或 git push
将通过网络发送的所有数据,在 git fetch
或 git fetch
之后git push
用于最小化此数据的通信过程。 (它可以包含额外的数据,这些数据将被简单地忽略。)这个最小数据包含所有必须复制的对象——带注释的标签、提交、树和 blob——加上引用名称及其值。
要从捆绑中排除一些文件集,那么,您需要只捆绑 U 提交,而不是任何 T 提交。就目前而言这很好:如果你复制了所有分支,并通过分支名称区分 T 提交和 U 提交,你可以实现这很容易。但结果是,每次您进行新的 T 提交时,您都必须进行相应的 U 提交,反之亦然。实际上,您的工作量增加了一倍。
一般适用于配置文件的标准建议也适用于此:永远不要提交任何配置。仅提交 sample 或 default 或 template 配置。 使用某种包装器来将这些示例配置转换为实际配置。 (当然,也可以提交包装器,如果它是您自己编写的东西,例如 shell 脚本或 Python 程序或其他任何东西。)您现在可以维护和版本控制这些示例/ 默认配置。克隆存储库获取样本,并从克隆更新——git fetch
,然后合并或变基——更新样本,但不触及实际配置。根据包装器的智能程度以及输出格式中可用的内容,1 它甚至可以自动检测 sample/default 输入已更改,并警告或失败任何 运行s 使用规定的工具(即包装器本身),直到更新实际配置以匹配来自 sample/default/模板配置的任何所需更改。
这仍然不是微不足道的——特别是,您可能必须编写一个包装器,并以正确的方式教育用户 运行 您的特定系统。但它与您可能实现的一样微不足道。
1在这种特殊情况下,您的输出很可能是 ansible 的 YAML 文件。这意味着您可以在评论中隐藏各种有用的 sample/default-config 信息,例如。