Show sha1 only with git log

I want to write a Bash script that loops over the sha1s of commits output by an invocation of git log. However, git log gives me much more output than I want:

commit 0375602ba2017ba8750a58e934b41153faee6fcb
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:35:07 2014 +0000

    Yet another commit message

    This one even has newlines.

commit 4390ee9f4428c84bdbeb2fed0a461099a6c81b39
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:30:19 2014 +0000

    Second commit message.

commit bff53bfbc56485c4c1007b0884bb1c0d61a1cf71
Author: Mark Amery <markamery@notmyrealemail.com>
Date:   Wed Jan 1 21:28:27 2014 +0000

    First commit message.

How can I get git log to just output sha1s so that I can loop over them conveniently?

  • Git Autocompletion: syntax error near unexpected token `newline'
  • Gitconfig: Permission denied
  • How to Push Project Back to Fork “origin” in GitHub
  • php shell exec acting different to running command directly
  • How to automate symlink script
  • Asking for password when pushing to gitlab?
  • Rails Capistrano - SSHKit::Command::Failed: bundle exit status: 16
  • Git Blog - the pelican template disappears in the new deployed blog but exists in localhost
  • Exclude auto-generated image sizes in WordPress uploads folder with gitignore
  • Giving access to parts of a github repository
  • Push Git branches directly into a live server directory so files are seen live
  • How to clone all repos at once from GitHub?
  • 2 Solutions collect form web for “Show sha1 only with git log”

    An alternative to git log --format is the git rev-list plumbing command. For scripting purposes it’s the recommended choice as the interface can be relied on to be stable (although for simple uses like this I’d be surprised if git log isn’t sufficiently stable).

    for sha1 in $(git rev-list HEAD) ; do
        : # Do something with $sha1
    done
    

    You can use the --format argument with a custom format that only includes the sha1:

    git log --format=format:%H
    

    The above command yields output like the following:

    0375602ba2017ba8750a58e934b41153faee6fcb
    4390ee9f4428c84bdbeb2fed0a461099a6c81b39
    bff53bfbc56485c4c1007b0884bb1c0d61a1cf71
    

    You can loop over the commit hashes in Bash like this:

    for sha1 in $(git log --format=format:%H); do
        : # Do something with $sha1
    done
    

    This is slightly more verbose than using git rev-list, but may be your only option if you want to use ordering or filtering arguments for git log that are not supported by git rev-list, like -S.

    Git Baby is a git and github fan, let's start git clone.