シェルスクリプトからGitリポジトリにプッシュ

シェルスクリプトからGitリポジトリにプッシュ

次のサンプルコードを使用して、リモートGitサーバーに変更をコミット/プッシュしようとしています。

#!/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}

シェルスクリプトを手動で呼び出すと(たとえば./commit.sh)、すぐに実行されます。代わりに、cron操作でトリガーすると、git push奇妙な理由でトリガーされないように見えるまで、すべてがうまく機能します。

これは私のcrontabラインです:

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

そして少し長い内容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

git pushスクリプトを手動で呼び出すときにのみ実行され、crontabを介して実行されたときに実行されないのはなぜですか?

答え1

どの監督がこの仕事をしたらいいですか?スクリプトでは明確ではありません。以下のようにディレクトリ1に移動してみてください。

#!/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

または1つを作成することもできますgit add --all /path/to/git/repo/files

編集する:

コマンドラインからスクリプトを実行することは、cronで実行するのと必ずしも同じではありません。このQ&Aをご覧ください。cronがジョブを実行するときの「作業ディレクトリ」とは何ですか?、特にザイルズの答え

1これを行う方法に関するいくつかのアイデアコマンドが成功したことを確認する

答え2

私は同じ問題があり、これが私が解決した方法です。

  1. まず、プッシュエラーの原因が何であるかを調べます。2>&1スクリプトの最後に追加すると、エラーログを取得できます。あなたの場合は次のとおりです。

    ${GIT} push [email protected]:username/repo.git master >> ${LOG} 2>&1
    
  2. プッシュがシェル内で実行されない理由はいくつかあります。次の基準を確認してください。

    • あなたのユーザー名とパスワードは正しく保存/キャッシュされました。テスト用のユーザー/パスを含むgit URLに直接プッシュできます(削除することを忘れないでください)。たとえば、

      ${GIT} push --repo https://YOUR_USER_NAME:[email protected]/repo.git  
      
    • GitがSSLについて文句を言わないことを確認してください。一時的にpushスクリプトの前半に次のコマンドを追加して無視します。

      export GIT_SSL_NO_VERIFY=1
      
  3. 正しいディレクトリで実行していない場合は、次のようにタスクに事前git pushステップを追加して、スクリプトを実行する前に目的のディレクトリに移動できます。cron

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

関連情報