【问题标题】:git ignore a specified type of change to file by rulegit按规则忽略指定类型的文件更改
【发布时间】:2021-12-21 07:19:05
【问题描述】:

我有一个存储库,其中包含运行第三方可执行文件时生成的文件。我需要跟踪此可执行文件生成的文件,以允许我在用户之间同步可执行文件设置。

让我们将此文件称为“executable_settings.json”

文件可以通过两种方式更改:

  1. 需要添加到存储库的设置更改
  2. 每次运行可执行文件时都会生成运行时更改,并以正则表达式可以捕获的指定方式更改文件(例如“编辑时间:XXXX-YY-ZZ”)。我不希望这些更改出现在 repo 中。

有没有办法让 git 根据规则自动忽略对 executbale_settings.json 的更改?我想找到一种方法,让类型 2 的更改不会显示为 git 的更改,除非同时也发生类型 1 的更改。

【问题讨论】:

  • 不,git 只能忽略基于文件 glob 的整个文件。
  • 谢谢@fredrik。我想知道是否有 git hooks 的解决方法?我对钩子没有任何经验,但我想知道是否可以在 git status 之前运行一个钩子,这样: if (no "Change 1") then(replace the "Change 2" with text in the以前的提交)这是可以使用挂钩的吗?
  • 您可以在git-scm.com/book/en/v2/Customizing-Git-Git-Hooks了解哪些钩子可用
  • Hooks 在这里帮不上忙。 合并驱动程序理论上可以提供帮助,但实际上也无济于事。

标签: git gitignore


【解决方案1】:

这里最好的方法是使用涂抹和清洁过滤器。这些在gitattributes(7) 文档中进行了概述,但总而言之,如果您在.gitattributes 中写一个条目,如下所示:

executable_settings.json  filter=exec-settings

然后将以下内容添加到您的配置中:

[filter "exec-settings"]
    clean = sed -e '/Edited On:/d'

那么当你使用git add 将文件添加到Git 时,它将删除所有包含“Edited On”的行。请注意,这本质上不会阻止它们被git status 标记为已修改,但会阻止这些行被签入。

请注意,您可以使用不同的命令(例如 jq 或脚本)过滤掉您不想要的条目。一旦您对过滤器感到满意,您应该添加.gitattributes,运行git add --renormalize . 以修复存储库中的文件,然后提交。

我应该指出,这通常是您系统本地的。无法将此配置包含在存储库中,以便自动调用它。这是因为这样做会允许任意代码执行。但是,您可以将设置脚本添加到您的存储库中,作为项目的一部分在本地安装此配置。

【讨论】:

  • 谢谢@bk2204 我正在试一试。但是有点卡在 sed 和正则表达式上。 “Edited On”不在一行,所以我不能删除整行。为了使可执行文件运行,我需要保留字符串“Edited On”。所以我只想删除字符串“Edited On”前面的YYYY-MM-DD。您能否建议对上面的 clean 命令进行编辑?
  • 你可以试试perl -pe 's/(Edited On:)\s+\d{4}-\d{2}-\d{2}/$1/g'(未经测试)。如果你不喜欢 Perl,你也可以用 sed 或 Ruby 做类似的事情。
  • 过滤器很神奇....谢谢!!!
  • 这是我最后使用的过滤器clean = perl -pe 's/(Edited On: )\\d{4}-\\d{2}-\\d{2}//g。需要双 \ 来转义 \
猜你喜欢
  • 2020-08-20
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2020-06-19
  • 2023-01-23
相关资源
最近更新 更多