我们刚刚将服务器配置移至 Git 存储库。因此,存储库文件夹中的任何内容都不应有任何更改。我正在考虑如何设置 cron 作业来检查是否有任何未提交的更改。
如何设置 cron 作业来检查 Git 存储库中的更改?
用 grep 命令的输出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 文件中。除了服务器配置外,还有用于内容(静态网站、Web 应用程序、WordPress 等)的 git 存储库。所有存储库都不应有本地更改。
我们可能会长期使用 Puppet,因为它被用于开发其中一个 Web 应用程序。
答案1
你应该使用git ls-files
该-m
标志将获取所有修改的自上次提交以来的文件。如果没有文件修改的,没有数据输出。这使得使用此命令设置 cronjob 变得非常容易,因为cronjob 默认只会在命令输出某些内容时发送邮件。
已删除文件是 pr. 定义修改的,因此它们也将在修改的视图。如果这样做git ls-files -m -d
,已删除的文件将被列出两次。
但请注意,这git ls-files -m
将仅显示文件修改的,因此将忽略未追踪文件。为了也显示未追踪文件,您需要传递-o
“其他文件”标志,以及传递--exclude-standard
排除.gitignore
和中列出的文件的选项.git/info/exclude
。
指定 git 目录和工作树
从 cronjob 运行命令时,您需要分别使用和指定.git
目录的路径和工作树。请参阅--git-dir
--work-tree
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
如果有变化,这将每分钟发送一封电子邮件。如果你想要不同的设置,我建议你查看cron
维基百科页面中的示例。
为什么git-ls-files
?
git ls-files
我推荐使用 的原因git status
是git status
是所谓的“瓷器”命令,而git ls-files
是“管道”命令。简而言之,瓷器命令是为向用户输出而设计的,而管道命令是为脚本而设计的。阅读有关 git ceramic 和 git plumbing 命令之间区别的更多信息。
答案2
您的问题中忽略了很多复杂性,因此我也将在回答中忽略它:
if [ `git status | grep -c "working directory clean"` -ne 1 ]; then
. . . you have changes . . .
else
. . . you don't have any changes . . .
fi
但请注意,这并不能告诉您是否已同步,或者本地更改是否合法,或者是否有更改时您真正想知道的任何信息。
您最好使用像 Puppet 或 Chef 这样的配置管理工具来处理您的配置文件 - 学习曲线最初可能有点陡峭,但它们大大简化了服务器/配置管理。