Trabalho Cron verificando mudanças no repositório Git

7

Acabamos de mudar nossas configurações de servidor para um repositório Git. Portanto, não deve haver nenhuma alteração em nenhuma das pastas do repositório. Eu estava pensando em como eu poderia configurar um cron job para verificar qualquer alteração não confirmada.

Como um trabalho cron pode ser configurado para verificar as alterações em um repositório Git?

A definição da saída do comando git status pode fazer isso. Os trabalhos do grep e cron não são o meu lado strong. Aqui estão alguns exemplos de saídas de git status :

Mantendo a pasta contendo o repositório git (por exemplo, /path/gitrepo/ ) com arquivos alterados :

$ 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")

Permanente na pasta quando houver sem alterações :

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

Atualização:

Sincronizado com origem não é importante. Não deve haver alterações locais. Arquivos locais que devem estar no lugar vão para o arquivo .gitignore. Além das configurações do servidor, existem git repos para conteúdo (sites estáticos, aplicativos da web, wordpress, etc). Nenhum dos repositórios deve ter alterações locais.

Poderíamos usar o Puppet a longo prazo desde que ele é usado para o desenvolvimento de um dos aplicativos da web.

    
por HNygard 19.06.2012 / 22:28

2 respostas

8

Você deve usar git ls-files

O -m flag receberá uma lista de todos os arquivos modificados desde o último commit. Se nenhum arquivo for modificado , nenhum dado será enviado . Isto torna extremamente fácil configurar um cronjob usando este comando, já que o cronjob irá por padrão apenas enviar um email se o comando gerar algo .

Os arquivos excluídos são pr. definição modificada , para que eles também sejam mostrados na exibição modificada . Se você fizer git ls-files -m -d , os arquivos excluídos serão listados duas vezes.

Observe, entretanto, que git ls-files -m mostrará apenas arquivos modificados e, portanto, ignorará os arquivos untracked . Para mostrar também os arquivos untracked , você precisará passar o sinalizador -o para "outros arquivos", além de passar a opção --exclude-standard para excluir os arquivos listados em .gitignore e .git/info/exclude .

Especificando o diretório git e a árvore de trabalho

Ao executar o comando a partir de um cronjob, você precisará especificar o caminho para o .git dir e a árvore de trabalho usando --git-dir e --work-tree , respectivamente. Veja git man pages para referência.

Configuração do Cronjob

O comando completo que você precisará executar no seu cronjob:

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

Seu crontab deve ser parecido com isto:

$ crontab -l
# m h  dom mon dow   command
* * * * * git --git-dir "/PATH/TO/DIR/.git" --work-tree "/PATH/TO/DIR" ls-files -m -o --exclude-standard

Isso enviará um e-mail a cada minuto se houver alterações. Se você deseja uma configuração diferente, confira os exemplos na página cron na Wikipedia .

Por que git-ls-files ?

O motivo pelo qual eu recomendo git ls-files over git status é que git status é o chamado comando "porcelain", enquanto git ls-files é um comando "encanamento". Em suma, os comandos de porcelana são projetados para a saída para o usuário, enquanto os comandos de encanamento são projetados para scripts. Leia mais sobre as diferenças entre os comandos git porcelain e git plumbing.

    
por 20.06.2012 / 09:40
6

Há muita complexidade que você ignora na sua pergunta, então vou ignorar isso na minha resposta:

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

No entanto, observe que isso não diz se você está sincronizado ou se as alterações são legítimas ou muito do que você gostaria de saber se houver alterações.

Provavelmente seria melhor usar uma ferramenta de gerenciamento de configuração como o Puppet ou o Chef para lidar com seus arquivos de configuração - a curva de aprendizado pode ser um pouco mais abrupta inicialmente, mas simplifica muito o gerenciamento do servidor / configuração.

    
por 19.06.2012 / 22:39