Нажатие на Git repo из сценария оболочки

Я пытаюсь зафиксировать / направить изменения на удаленный сервер 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 git@bitbucket.org:username/repo.git master >> ${LOG} # Depends on libnotify ${NOTIFY} 'KB notification' 'Changes were pushed to Bitbucket.' --icon=dialog-information >> ${LOG} 

Если я ./commit.sh скрипт оболочки вручную (например ./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' 'git@bitbucket.org:username/repo.git' 'master' 09:53:32.732514 run-command.c:341 trace: run_command: 'ssh' 'git@bitbucket.org' '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 git@bitbucket.org:username/repo.git 0ef4905..91437d0 master -> master 

Почему git push запускается только тогда, когда скрипт вызывается вручную, а не при запуске через crontab?

2 Solutions collect form web for “Нажатие на Git repo из сценария оболочки”

Какой директор (ies | y) вы хотите сделать? Это не ясно из вашего скрипта. Попробуйте войти в каталог 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 git@bitbucket.org:username/repo.git master 

Или вы можете сделать git add --all /path/to/git/repo/files .

Изменить :

Запуск сценария из командной строки не обязательно совпадает с запуском его из cron; см. этот вопрос: что такое «рабочий каталог», когда cron выполняет задание , особенно ответ Гилла .

1 Некоторые идеи о том, как проверить, удалась ли команда

Я столкнулся с той же проблемой, и именно так я ее исправил:

  1. Во-первых, попробуйте выяснить, почему ошибка вашего толчка. Вы можете получить журнал ошибок, добавив 2>&1 в конец вашего скрипта. В вашем случае это будет:

     ${GIT} push git@bitbucket.org:username/repo.git master >> ${LOG} 2>&1 
  2. Несколько причин могут привести к тому, что ваш push не работает изнутри вашей оболочки. Проверьте эти критерии:

    • ваше имя пользователя и пароль сохранены / сохранены. Вы можете нажать на git URL напрямую, включая ваш User / Pass, только для теста (НЕ забывайте удалить их). например:

       ${GIT} push --repo https://YOUR_USER_NAME:YOUR_PASSWORD@bitbucket.org/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 
  • удалить путь "/" из имени файла
  • объединить несколько одинаковых эхо-сигналов в один эхо из цикла for в bash
  • Поиск отсутствующего значения в текстовом файле
  • Создание системы для сценариев оболочки
  • (test -n $ st)! = (test -z $ st) право?
  • nemo: Контекстное меню Действие Запуск сценария, который заставляет выбранную символическую ссылку быть относительной
  • Простой сценарий оболочки Korn должен содержать список всех файлов, созданных / измененных после tidemark date
  • Сценарий оболочки, чтобы найти, какой пакет предоставляет файл на OpenBSD
  • что означает $ * в shell
  • Bash: запустить команду2, если команда1 не выполнена
  • Как проверить, открыт ли конкретный порт на машине из сценария оболочки и выполнить действие на основе этого?
  • Linux и Unix - лучшая ОС в мире.