使用 git 跟踪 crontab 更改

Mar*_*ter 7 cron git

我想用它git来跟踪crontab.

我已经初始化了一个新的 git 存储库 /var/spool/cron/crontabs/

现在的问题是,在保存 crontab 时,标题的第二行会发生变化,因为它包含时间戳。

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.ubNueW/crontab installed on Thu Aug  1 06:29:24 2019)
Run Code Online (Sandbox Code Playgroud)

忽略这些无关更改的最简单方法是什么?

可能重复的问题并没有解决我的问题的重点:如何忽略来自crontab中第2行无关。相反,它解决了一些我没有问过的其他问题,例如一些钩子。

Kus*_*nda 8

你永远不应该手动接触 cron spool 目录中的文件。对那里的文件进行更改不会正确通知 cron 守护程序,并且在守护程序重新启动之前对计划的更新不会变为活动状态。(某些 cron 守护程序实现可能会定期检查假脱机以查看其中是否有更新的文件,但这种行为并不普遍;请查看您的cron(8)手册)。

cron(8)Ubuntu 上的手册说

请注意,不应直接访问此目录中的 crontabs -crontab应使用该命令来访问和更新它们。

您应该始终使用该crontab命令加载新计划或删除现有计划。

至于在 Git 中保留 crontabs,我认为这没有问题,但是,正如我上面提到的,您不应该/var/spool/cron/crontabs检查该存储库。相反,让它存在于其他地方并手动加载 crontabs,例如

crontab my-crontab.txt
Run Code Online (Sandbox Code Playgroud)

my-crontab.txt用 Git 管理的文件在哪里。

这还可以避免您的 cron 守护程序修改文件时遇到的问题。


Amo*_*mos 5

您可以使用过滤器:

git config filter.dropSecondLine.clean "sed '2d'"
Run Code Online (Sandbox Code Playgroud)

编辑/创建 .git/info/attributes 并添加:

* filter=dropSecondLine
Run Code Online (Sandbox Code Playgroud)

如果您不希望过滤器作用于存储库中的所有文件,请修改 * 以匹配适当的模式或文件名。

效果将是工作目录将保持不变,但 repo blob 将不会在文件中包含第二行。所以如果你把它拉到别处,第二行就不会出现(sed 'd2' 的结果)。如果您更改日志文件的第二行,您将能够添加它,但不能提交它,因为对 blob 的更改发生在添加时,此时它将与存储库中的文件相同。

  • 我能否建议,基于 https://git-scm.com/docs/gitattributes“如果运行两次,clean 不应进一步改变其输出”,`sed` 命令使用正则表达式来匹配注释的时间戳(ala larsks 的评论`/^# (.*installed on.*)`) 而不是盲目删除第 2 行? (2认同)