web-dev-qa-db-ja.com

Gitリポジトリの変更を確認するcronジョブ

サーバー構成を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アプリの開発に使用されているため、長期的には使用する可能性があります。

7
HNygard

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

Git dirと作業ツリーの指定

Cronジョブからコマンドを実行する場合は、.gitディレクトリへのパスと、それぞれ--git-dir--work-treeを使用した作業ツリーを指定する必要があります。参考のために git man pages を参照してください。

Cronjobのセットアップ

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コマンドの違いについてもっと読む。

8
ohaal

あなたの質問では無視する複雑さがたくさんあるので、私の答えではそれを無視します:

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

ただし、これは同期されているかどうか、ローカルでの変更が正当であるかどうか、または変更があるかどうかを知りたいことの多くはわかりません。

PuppetやChefなどの構成管理ツールを使用して構成ファイルを処理する方がよいでしょう。最初は学習曲線が少し急になるかもしれませんが、サーバー/構成管理が大幅に簡素化されます。

6
voretaq7