I am writing a custom git command that should only run in a completely new repository with no commits (see this question). How can I perform a simple check within my script to see if an existing repo has zero commits?
Essentially, what goes in the blank below?
if ___________ ; then echo "Git repo already has commits. Aborting. else echo "Git repo has no commits. Doing whatever my script does." fi
On GitHub.com, you can access your project history by selecting the commit button from the code tab on your project. Locally, you can use git log . The git log command enables you to display a list of all of the commits on your current branch. By default, the git log command presents a lot of information all at once.
To check the status, open the git bash, and run the status command on your desired directory. It will run as follows: $ git status.
I think an option for your purposes is git log --oneline --decorate . This lets you know the checked commit, and the top commits for each branch that you have in your story line. By doing this, you have a nice view on the structure of your repo and the commits associated to a specific branch.
Summary:
git rev-parse HEAD &> /dev/null
git rev-list -n 1 --all &> /dev/null
git fsck
, git count-objects
, or the examine the contents of .git/objects
And now for the discussion!
If you want to know whether a commit is checked out, you can use git rev-parse HEAD
. There will be output, so you probably want to redirect to /dev/null
and just use the exit code. For all practical purposes, this will be good enough - doing normal things, it's pretty much impossible to end up without HEAD
pointing at anything. But it is possible, for example by deleting files in the .git directory. Depending on your script, this might be important - if you're about to blow away the .git directory, you want to be paranoid indeed.
If you want to see whether there are any refs at all with commits on them, you can use git rev-list -n 1 --all
. Again, there will be output (the SHA1 of the first commit encountered), so redirect to /dev/null
and check the exit code.
Finally, if you want to check if there are any commits - even if they aren't on any refs (you have to try really hard to get into this state) I'd probably just check for the presence of objects with git fsck
or git count-objects
- or failing that, list .git/objects
and check for anything besides info
and pack
(commands tend to fail if there is no file .git/HEAD
). And yes, you could actually have a repo with blobs and trees but no commits, but you'd have to try even harder to get there. These are the absolute safest methods, if your script is scary.
You want to use git log
If you are using cygwin or are on a linux machine gitk
is a useful program to have as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With