【问题标题】:Can git ignore some specific line from git status?git 可以忽略 git status 中的某些特定行吗?
【发布时间】:2020-12-28 06:41:37
【问题描述】:

在生成这些文件时,我需要忽略某些包含时间戳的文件中的某些行。有时我们会生成这些文件,但文件中唯一的变化是我们不关心的时间戳,并且文件不应该被 git status 定位为提交。

我知道我可以在这个主题上使用 git 过滤器:How to tell git to ignore individual lines, i.e. gitignore for specific lines of code

但在这种情况下,当我执行 git add 时,它会删除行。 如果文件中有其他更改而不是时间戳(时间戳行将被忽略),我希望提交这些行。但如果更改只是时间戳行,我不希望提交文件。

如何使用 git 过滤器做到这一点?

谢谢

【问题讨论】:

    标签: git github gitlab


    【解决方案1】:

    在查找差异时使用文本转换排除噪音,然后您可以只添加您关心的更改文件。 git add 不会自动运行差异来检测更改,它经常执行并且需要快速,但是编写脚本很容易。

    在您对特定差异(不)感兴趣的文件上设置自定义 diff 属性值,配置差异的文本转换,运行差异以检测有您关心的更改的文件,添加这些。

    假设sed 's,^#Timestamp:.*',#Timestamp:<whatever>,' 将使所有时间戳行相同,因此如果您在检查差异之前对内容运行它,则不会显示时间戳更改,即使它们存在于文件中。

    *.xyz diff=notimestamp
    

    在属性文件中,对于 repo-local 工作,如初始测试,.git/info/attributes 是正确的位置。

    然后在.git/config中配置notimestamp diff预处理:

    [diff "notimestamp"]
            textconv = "sed 's,^#Timestamp:.*,#Timestamp:<whatever>,'"
    

    现在,无论何时 git 在 *.xyz 文件上运行完整差异,它都不会看到时间戳更改。所以你可以

    git diff | sed -n '/^diff/s,.* b/,,p'
    

    查看具有您确实关心的更改的文件列表,并添加这些文件(例如,您可以将 diff 标头替换为 git add 而不是什么都没有,然后运行生成的命令)。

    【讨论】:

    • 这听起来不错,但我真的需要这些更改是透明和自动的。因为我正在开发一种工具,它可以生成气流 dag(它包含时间戳)并自动将更改和新的 dag(如果它们已更改)推送到正确的存储库中(有多个 repo)。有没有办法确保 git 在我们提交时忽略某些行的更改而不删除它们?我希望我更清楚。
    • 脚本的全部意义在于自动化,这个过程很简单地简化为git diff | sh,你可以添加一个git别名来让git publish做你想做的任何事情。你能解释一下“透明”是什么意思吗?
    • 要直接回答您评论中的问题,“有没有办法确保 git 忽略某些行的更改而不在我们提交它们时删除它们”,是的,有:要求它执行以上程序,以最方便的方式。让您的工具执行上述git diff | sed 并仅添加您关心的更改文件。
    • 透明是指最终用户不必关心这些时间戳。并且他们的存储库不应提交仅包含时间戳更改的文件。
    • 在我看来,他们可以使用您的工具,您已经构建了该工具来做他们想做的事。显然你看到了一些问题,但我不知道它是什么。
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2013-04-17
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2010-10-04
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多