How do I execute a Git command without being in the repository?

Use -C as the first argument to git:

git -C /home/repo log

Per the docs, the effect of this is:

-C <path>

Run as if git was started in <path> instead of the current working directory. …

This is almost equivalent to --git-dir and --work-tree without appending the usual .git folder. However, the options --git-dir and --work-tree do not exist to access the repository from outside the work tree; they are used to move the .git somewhere else, and they are much more complicated to use in some cases.

For instance, to get the log of /home/repo/subdir only:

git -C /home/repo/subdir log .

or

git -C /home/repo log subdir

It is not possible to use log . with --git-dir or --work-tree. The path must be processed to extract the subpath relative to the top of the work tree, and even in that case, git will not recognize it as a path if you do not use the -- option, so the only possible way is:

git --git-dir /home/repo/.git log -- subdir

Furthermore, --work-tree does not work at all with the log subcommand with my version (git 1.9.1). It is just ignored:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

I do not even understand if this is a bug or a feature… as usual with many git design choices.

Leave a Comment