サーバー構成をGitリポジトリに移動しました。したがって、どのリポジトリフォルダにも変更はありません。コミットされていない変更をチェックするためにcronジョブを設定する方法を考えていました。
Gitリポジトリの変更をチェックするためにcronジョブを設定するにはどうすればよいですか?
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)
更新:
Originと同期することは重要ではありません。ローカルな変更はありません。配置する必要のあるローカルファイルは、.gitignoreファイルに入ります。サーバー構成に加えて、コンテンツ(静的Webサイト、Webアプリ、ワードプレスなど)のgitリポジトリもあります。どのリポジトリもローカルで変更するべきではありません。
Puppetは、Webアプリの開発に使用されているため、長期的には使用する可能性があります。
git ls-files
を使用する必要があります-m
フラグは、最後のコミット以降のすべての変更済みファイルのリストを取得します。 変更済みのファイルがない場合、データは出力されません。 デフォルトでは、cronjobはコマンドが何かを出力した場合にのみメールを送信するため、このコマンドを使用してcronjobを設定することは非常に簡単です。
削除済みファイルはprです。定義変更なので、それらは変更ビューにも表示されます。 git ls-files -m -d
を実行すると、削除されたファイルが2回一覧表示されます。
ただし、git ls-files -m
はファイル変更済みのみを表示するため、追跡されていないファイルは無視されることに注意してください。 ntrackedファイルも表示するには、「他のファイル」の-o
フラグを渡す必要があります。また、リストにあるファイルを除外するオプション--exclude-standard
を渡す必要があります.gitignore
および.git/info/exclude
。
Cronジョブからコマンドを実行する場合は、.git
ディレクトリへのパスと、それぞれ--git-dir
と--work-tree
を使用した作業ツリーを指定する必要があります。参考のために git
man pages を参照してください。
Cronジョブで実行する必要がある完全なコマンド:
$ 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 command * * * * * 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
は「配管」コマンドであるためです。つまり、磁器コマンドはユーザーへの出力用に設計され、配管コマンドはスクリプト用に設計されています。 gitporcelainコマンドとgitplumbingコマンドの違いについてもっと読む。
あなたの質問では無視する複雑さがたくさんあるので、私の答えではそれを無視します:
if [ `git status | grep -c "working directory clean"` -ne 1 ]; then
. . . you have changes . . .
else
. . . you don't have any changes . . .
fi
ただし、これは同期されているかどうか、ローカルでの変更が正当であるかどうか、または変更があるかどうかを知りたいことの多くはわかりません。
PuppetやChefなどの構成管理ツールを使用して構成ファイルを処理する方がよいでしょう。最初は学習曲線が少し急になるかもしれませんが、サーバー/構成管理が大幅に簡素化されます。