你应该使用git ls-files

你应该使用git ls-files

我们刚刚将服务器配置移至 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-treegit手册页以供参考。

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 statusgit 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 这样的配置管理工具来处理您的配置文件 - 学习曲线最初可能有点陡峭,但它们大大简化了服务器/配置管理。

相关内容