如何执行Git命令而不在存储库文件夹中?

有没有办法执行Git命令对存储库,而不是在该存储库文件夹?

例如这样的事情: git /home/repo log

请不要告诉我cd 。 我正在通过exec调用来做这件事。

尝试

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

使用-C选项( 文档 ):

 git -C /home/repo log 

几乎等同于--git-dir--work-tree而不添加通常的.git文件夹

编辑:

答案downvoted …相当惊人,严格地说,这是唯一正确的答案。 选项--git-dir--work-tree不存在从工作树外部访问存储库,它们被用来将.git移动到其他地方,在某些情况下它们要复杂得多。

例如,仅获取/home/repo/subdir的日志:

 git -C /home/repo/subdir log . 

要么

 git -C /home/repo log subdir 

这是不可能使用log .--git-dir--work-tree 。 必须处理path以提取相对于工作树顶部的子path,即使在这种情况下,如果不使用--选项,git也不会将其识别为path,所以唯一可行的方法是:

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

而且,– --work-tree根本不能和我的版本(git 1.9.1)一起使用log子命令。 它被忽略:

 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 

我甚至不知道这是一个bug还是一个function,就像往常一样,有许多gitdeviseselect。

实际上你需要一起使用–git-dir和–work-tree。 这里是一个例子:

 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 

这与@ max的答案类似。 不幸的是, – git-dir没有做我所需要的。 编辑回想起来,我还没有读过的另一个[以前的]答案build议使用--work-tree 。 我不确定使用环境或标志是否更合适,所以我会留下我的答案,以防有人使用它,但我会切换到使用--work-tree / – --git-dir


有两个回购,一个在另一个里面,但不是一个子模块; 外面的回购忽略它:

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

我想要的是相对于外部回购的git rev-parse --show-prefix的输出。 这就是我想出来的(bash语法;为了可读性而跨行分割):

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

当从4.9.2中执行时,它会产生stringgcc/4.9.2

我已经尝试了很多次! 我终于明白了!

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

请记住,请不要将.git添加到您的

-C dir