How do I execute a Git command without being in th

2020-02-02 06:03发布

Is there a way to execute Git commands against a repository without being in that repository?

For example something like this: git /home/repo log?

Please do not tell me to cd to it. I'm doing this via an exec call.

标签: git
5条回答
老娘就宠你
2楼-- · 2020-02-02 06:35

I have tried many times! I finally got it!

git -C dir --no-pager log --format='%an' -1 filename

do remember, please don't add .git to your

-C dir

查看更多
一夜七次
3楼-- · 2020-02-02 06:36

Try:

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

It is important to give the path all the way up to the .git directory of your repository. Otherwise you will get only an error message that says something like:

fatal: Not a git repository
查看更多
姐就是有狂的资本
4楼-- · 2020-02-02 06:36

In fact you need to use --git-dir and --work-tree together. Here is an example:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di
查看更多
女痞
5楼-- · 2020-02-02 06:40

Use -C option (docs):

git -C /home/repo log

This is almost equivalent to --git-dir and --work-tree without appending the usual .git folder

Edit:

Answer downvoted... quite amazing, as, strictly speaking, this is the only correct answer to the question. The options --git-dir and --work-tree are not existing 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 is not working at all with 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.

查看更多
Fickle 薄情
6楼-- · 2020-02-02 06:43

This is similar to @max's answer. Unfortunately, --git-dir didn't do what I needed. edit In retrospect, another [previous] answer I hadn't read suggested using --work-tree. I'm not sure whether using environment or flags is more appropriate so I'll leave my answer in case someone finds use in it, but I'll be switching to use --work-tree / --git-dir.


There's two repos, one inside the other but not a submodule; the outer repo ignores it:

tools (outer repo)
  gcc/4.9.2 (inner repo)

What I wanted was the output of git rev-parse --show-prefix relative to the outer repo. Here's what I came up with (bash syntax; split across lines for readability):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

When executed from within 4.9.2 it produces the string gcc/4.9.2.

查看更多
登录 后发表回答