Cron 作业检查 Git 存储库中的更改

HNy*_*ard 8 monitoring grep git cron

我们刚刚将服务器配置移至 Git 存储库。因此,不应在任何存储库文件夹中进行任何更改。我在考虑如何设置一个 cron 作业来检查任何未提交的更改。

如何设置 cron 作业来检查 Git 存储库中的更改?

Grepinggit status命令的输出可能只是这样做。Grep 和 cron 工作不是我的强项。以下是一些示例输出git status

将包含 git 存储库(例如/path/gitrepo/)的文件夹与已更改的文件保持一致

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   apache2/sites-enabled/000-default
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   apache2/conf.d/test
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)

没有变化时站在文件夹中:

$ git status
# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

更新:

与原点同步并不重要。应该没有本地更改。必须到位的本地文件进入 .gitignore 文件。除了服务器配置之外,还有用于内容(静态网站、Web 应用程序、wordpress 等)的 git 存储库。任何存储库都不应进行本地更改。

从长远来看,我们可能会使用 Puppet,因为它被用于开发其中一个 Web 应用程序。

oha*_*aal 8

你应该使用 git ls-files

-m标志将获取自上次提交以来所有修改过的文件的列表。如果没有文件被修改,则不输出数据。这使得使用此命令设置 cronjob 变得非常容易,因为默认情况下,cronjob 只会在命令输出内容时发送邮件

删除的文件是公关。定义已修改,因此它们也将显示在修改后的视图中。如果这样做git ls-files -m -d,删除的文件将被列出两次。

但是请注意,git ls-files -m这只会显示已修改的文件,因此将忽略未跟踪的文件。为了还显示未跟踪的文件,您需要传递-o“其他文件”的标志,以及传递--exclude-standard排除.gitignore和 中列出的文件的选项.git/info/exclude

指定 git dir 和工作树

从 cronjob 运行命令时,您需要分别.git使用--git-dir和指定目录和工作树的路径--work-tree。请参阅git手册页以供参考。

定时任务设置

您需要在 cronjob 中运行的完整命令:

$ git --git-dir "/PATH/TO/DIR/.git" --work-tree "/PATH/TO/DIR" ls-files -m -o --exclude-standard
Run Code Online (Sandbox Code Playgroud)

你的 crontab 应该是这样的:

$ crontab -l
# mh dom mon dow 命令
* * * * * git --git-dir "/PATH/TO/DIR/.git" --work-tree "/PATH/TO/DIR" ls-files -m -o --exclude-standard

如果有更改,这将每分钟发送一封电子邮件。如果您想要不同的设置,我建议您查看Wikipedia 页面中的示例cron

为什么git-ls-files

我推荐的理由git ls-filesgit statusgit status一个所谓的“瓷都”的命令,同时git ls-files是一个“管道”命令。简而言之,瓷器命令是为输出给用户而设计的,而管道命令是为脚本设计的。阅读有关 git 瓷器和 git 管道命令之间差异的更多信息。


vor*_*aq7 6

您在问题中忽略了很多复杂性,因此我将在回答中忽略它:

if [ `git status | grep -c "working directory clean"` -ne 1 ]; then
    . . . you have changes . . .
else
    . . . you don't have any changes . . . 
fi
Run Code Online (Sandbox Code Playgroud)

但是请注意,这不会告诉您是否已同步,或者本地更改是否合法,或者您想知道是否有更改。

您可能最好使用 Puppet 或 Chef 之类的配置管理工具来处理您的配置文件 - 最初的学习曲线可能有点陡峭,但它们极大地简化了服务器/配置管理。