I'm trying to write a simple cron job that will keep my org-mode files in sync with a GitHub repo by committing every now and then. For some reason, it always manages to commit the files, but even though I see output for the git push when running the script from the command line, like

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 329 bytes | 329.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To github.com:my/repo.git
   df98efb..0d4943b  master -> master

git status still tells me I need to push:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

Here's my script:


message="auto-commit from $USER@$(hostname -s) on $(date)"
GIT=`which git`
cd ${REPO_DIR}
${GIT} add --all .
${GIT} commit -m "$message"
${GIT} push [email protected]:my/repo.git master

And here's what it looks like in my crontab:

* * * * * echo ["$(date)"] "$(echo "$(~/cron/scripts/org-commit.sh | tail -1)" | xargs)" >> ~/cron/log/org-commit.log 2>&1

In ~/cron/log/org-commit.log, I see this:

[Wed Jun 12 16:44:00 CDT 2019] nothing to commit, working tree clean
[Wed Jun 12 16:45:00 CDT 2019] 1 file changed, 1 insertion(+)

Where the first line was when it run without changes, and the second there was one change. It seems as if git push is never even running, as that log line is from git commit...

How can I find what's causing this?

  • It would be much easier to debug if you move the logging into the script and reduce the crontab task line as far as possible. What is that xargs doing there, for example? And the tail -1?
    – user147505
    Jun 12, 2019 at 22:32
  • What does git remote -vv show? I'm guessing your URL for origin doesn't exactly match [email protected]:my/repo.git, so until the next git fetch Git won't know that your upstream was updated... Try using git push origin master instead on your shell script. (Happy to convert this to an answer if it does indeed solve your problem.)
    – filbranden
    Jun 12, 2019 at 22:56
  • @filbranden git remote -vv shows the same remote I had on the script: origin [email protected]:brunobely/org-mode.git (fetch) origin [email protected]:brunobely/org-mode.git (push) changing the git push line to git push origin master now made it so that running that whole cron task from the command line gets the repo to be pushed, however it's still left unpushed if cron runs it...
    – sleighty
    Jun 12, 2019 at 23:27
  • @filbranden I believe it might be working now with just git push instead of the other ones, although I'm unsure as to why
    – sleighty
    Jun 12, 2019 at 23:28
  • @Tomasz I'll try to move that into the script. xargs is just trimming the whitespace around the output I get from tail -1 (I wanted to add to add the last line of output to the commit message)
    – sleighty
    Jun 12, 2019 at 23:29

1 Answer 1


I think your issue is that git push is actually asynchronous. Assigning the result to a variable and then echoing the result should work. Something like the following should output the response you're expecting.


message="auto-commit from $USER@$(hostname -s) on $(date)"
GIT=`which git`
cd ${REPO_DIR}
${GIT} add --all .
${GIT} commit -m "$message"

gitPush=$(${GIT} push -vvv [email protected]:my/repo.git master 2>&1)
echo "$gitPush"

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .