Empurrando para um repositório Git do shell script

0

Estou tentando confirmar / enviar alterações para um servidor Git remoto com o código de amostra abaixo:

#!/bin/sh

USER='username'
REPO='/home/'${USER}'/Sites/git/bitbucket/kb'
COMMIT_TIMESTAMP='date +'%Y-%m-%d %H:%M:%S %Z''
DATELOG='date +'%Y-%m-%d-%H-%M-%S''
LOG="/tmp/${DATELOG}.txt"

MKDOCS='which mkdocs'
GIT='which git'
NOTIFY='which notify-send'

# Only proceed if we have a valid repo.
if [ ! -d ${REPO}/.git ]; then
  echo "${REPO} is not a valid git repo! Aborting..." >> ${LOG}
  exit 0
else
  echo "${REPO} is a valid git repo! Proceeding..." >> ${LOG}
fi

cd ${REPO}
${MKDOCS} build --clean >> ${LOG}
${GIT} add --all . >> ${LOG}
${GIT} commit -m "Automated commit on ${COMMIT_TIMESTAMP}" >> ${LOG}
${GIT} push [email protected]:username/repo.git master >> ${LOG}

# Depends on libnotify
${NOTIFY} 'KB notification' 'Changes were pushed to Bitbucket.' --icon=dialog-information >> ${LOG}

Se eu invocar o script de shell manualmente (por exemplo, ./commit.sh ), ele funcionará imediatamente. Pelo contrário, quando acionado por meio de um cron job, tudo funciona bem até o git push , que nunca parece ser acionado por algum motivo estranho.

Aqui está a minha linha crontab:

*/20 * * * * /home/username/Sites/git/repo/commit.sh

E algum detalhamento para git push

09:53:32.732216 git.c:349               trace: built-in: git 'push' '[email protected]:username/repo.git' 'master'
09:53:32.732514 run-command.c:341       trace: run_command: 'ssh' '[email protected]' 'git-receive-pack '\''username/repo.git'\'''
09:53:39.665197 run-command.c:341       trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
09:53:39.665526 exec_cmd.c:134          trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
09:53:39.666778 git.c:349               trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 4.23 KiB | 0 bytes/s, done.
Total 7 (delta 4), reused 0 (delta 0)
To [email protected]:username/repo.git
   0ef4905..91437d0  master -> master

Como é que git push seria acionado apenas quando o script fosse invocado manualmente e não quando executado através do crontab?

    
por anavarre 31.08.2015 / 22:26

2 respostas

3

Que diretor (s) você está procurando fazer isso? Não está claro no seu roteiro. Tente entrar no diretório 1 , algo como:

#!/bin/sh

GIT='which git'
REPO_DIR=/home/username/Sites/git/repo/
cd ${REPO_DIR}
${GIT} add --all .
${GIT} commit -m "Test commit"
${GIT} push [email protected]:username/repo.git master

Ou você pode fazer um git add --all /path/to/git/repo/files .

Editar :

A execução de um script a partir da linha de comando não é necessariamente o mesmo que executá-lo no cron; veja este Q & A: Qual é o 'diretório de trabalho' quando o cron executa um trabalho , especialmente Gilles 'answer .

1 Algumas idéias sobre como verificar se um comando foi bem-sucedido

    
por 31.08.2015 / 22:36
0

Eu enfrentei o mesmo problema e foi assim que consertei:

  1. Primeiro, tente descobrir por que o erro do seu empurrão. Você pode obter o log de erros adicionando 2>&1 no final do seu script. No seu caso, seria:

    ${GIT} push [email protected]:username/repo.git master >> ${LOG} 2>&1
    
  2. Vários motivos podem fazer com que seu push não esteja funcionando dentro do seu shell. Verifique estes critérios:

    • seu nome de usuário e senha são armazenados / armazenados em cache corretamente. Você pode enviar para git URL diretamente incluindo seu usuário / passe apenas para teste (não esqueça de removê-los). por exemplo:

      ${GIT} push --repo https://YOUR_USER_NAME:[email protected]/repo.git  
      
    • Verifique se o Git não está reclamando sobre o SSL (você pode temporariamente ignorá-lo adicionando este comando antes do seu push no seu script:

      export GIT_SSL_NO_VERIFY=1
      
  3. Caso você não esteja se git push for executado no diretório correto, você pode ir para o diretório desejado antes que o script seja executado, adicionando a etapa anterior ao seu trabalho cron da seguinte forma:

    */20 * * * * cd /home/'${USER}'/Sites/git/bitbucket/kb && /home/username/Sites/git/repo/commit.sh
    
por 31.05.2016 / 17:56