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

我们刚刚将我们的服务器configuration移到了Git存储库。 因此,任何存储库文件夹都不应该有任何更改。 我正在考虑如何设置一个cron作业来检查是否有任何未改变的变化。

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

格式化git 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") 

站在文件夹里的时候没有什么变化

 $ git status # On branch master nothing to commit (working directory clean) 

更新:

与起源同步并不重要。 不应该有本地的变化。 必须在位的本地文件进入.gitignore文件。 除了服务器configuration,还有内容的git仓库(静态网站,networking应用程序,wordpress等)。 没有一个仓库应该有本地的变化。

自从用于Web应用程序的开发之后,我们可能会长期使用Puppet。

你应该使用git ls-files

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

删除的文件是公关。 定义修改 ,所以他们也将在修改视图中显示。 如果你使用git ls-files -m -d ,删除的文件将被列出两次。

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

指定git目录和工作树

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

Cronjob设置

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

 $ git --git-dir "/PATH/TO/DIR/.git" --work-tree "/PATH/TO/DIR" ls-files -m -o --exclude-standard 

你的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

如果有变化,这将每分钟发送一个电子邮件。 如果你想要一个不同的设置,我build议你查看维基百科上的cron页面的例子 。

为什么git-ls-files

我推荐git ls-files over git statusgit status是一个所谓的“瓷器”命令,而git ls-files是一个“plumbing”命令。 简而言之,瓷器命令是为输出给用户而devise的,而pipe道命令是为脚本devise的。 阅读更多关于git瓷器和gitpipe道命令的区别。

在你的问题中你忽略了很多复杂性,所以我会在我的答案中忽略它:

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

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

使用像Puppet或Chef这样的configurationpipe理工具来处理你的configuration文件可能会更好 – 学习曲线起初可能有点陡峭,但是它们极大地简化了服务器/configurationpipe理。