以下のサンプルコードを使用して、リモート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、 何かのようなもの:
#!/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
または、git add --all /path/to/git/repo/files
。
編集:
コマンドラインからスクリプトを実行することは、cronから実行することと必ずしも同じではありません。このQ&Aを参照してください: cronがジョブを実行するときの「作業ディレクトリ」とは何ですか 、特に Gillesの回答 。
1コマンドが成功したかどうかを チェックする方法に関するいくつかのアイデア
私は同じ問題に直面し、それが私がそれを修正した方法です:
まず、Pushのエラーの原因を調べてみてください。スクリプトの最後に2>&1
を追加すると、エラーログを取得できます。あなたの場合は次のようになります:
${GIT} Push [email protected]:username/repo.git master >> ${LOG} 2>&1
いくつかの理由により、シェル内からプッシュが機能しない可能性があります。次の基準を確認してください。
ユーザー名とパスワードが正しく保存/キャッシュされている。テストのためだけにユーザー/パスを含めてgit URLに直接プッシュできます(削除することを忘れないでください)。例えば。:
${GIT} Push --repo https://YOUR_USER_NAME:[email protected]/repo.git
スクリプトのPush
の前に次のコマンドを追加することで、GitがSSLについて文句を言っていないことを確認します(一時的に無視できます)。
export GIT_SSL_NO_VERIFY=1
正しいディレクトリでgit Push
が実行されていない場合は、次のようにcron
ジョブにプレステップを追加することにより、スクリプトが実行される前に目的のディレクトリに移動できます。
*/20 * * * * cd /home/'${USER}'/Sites/git/bitbucket/kb && /home/username/Sites/git/repo/commit.sh