是否有一种方法可以在不位于存储库的情况下对存储库执行Git命令?
例如:git /home/repo log?
请不要告诉我cd到它。我是通过高管电话来做这件事的。
是否有一种方法可以在不位于存储库的情况下对存储库执行Git命令?
例如:git /home/repo log?
请不要告诉我cd到它。我是通过高管电话来做这件事的。
当前回答
对于任何git命令,你可以这样做:
git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>
例如,如果你想做一个git状态:
git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/ status
或者如果你想检查回购所在的分支:
git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/ rev-parse --abbrev-ref HEAD
其他回答
这和@max的答案相似。不幸的是,——git-dir不能满足我的需求。回想起来,我之前没有读过的另一个答案建议使用——work-tree。我不确定使用环境或标志哪个更合适,所以我会留下我的答案,以防有人发现它的用途,但我会切换到使用——work-tree /——git-dir。
有两个repo,一个在另一个里面,但不是子模块;外部回购会忽略它:
tools (outer repo)
gcc/4.9.2 (inner repo)
我想要的是git rev-parse——show-prefix相对于外部repo的输出。这是我想到的(bash语法;为提高可读性而跨行分割):
prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)
当在4.9.2范围内执行时,它会生成字符串gcc/4.9.2。
Try:
git --git-dir=/home/repo/.git log
重要的是要给出一直到存储库的.git目录的路径。否则,你只会得到一个错误消息,内容如下:
fatal: Not a git repository
实际上,您需要同时使用——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
我已经试过很多次了! 我终于明白了!
git -C dir——no-pager log——format='%an' -1文件名
记住,请不要把。git加到你的
-C你
使用-C作为git的第一个参数:
git -C /home/repo log
根据文档,这样做的效果是:
- c <路径> 运行时就像git在<path>而不是当前工作目录. ...中启动一样
这几乎等同于——git-dir和——work-tree,而不附加通常的.git文件夹。然而,从工作树外部访问存储库的选项——git-dir和——work-tree并不存在;它们用于将.git移动到其他地方,在某些情况下使用起来要复杂得多。
例如,只获取/home/repo/subdir的日志:
git -C /home/repo/subdir log .
or
git -C /home/repo log subdir
使用日志是不可能的。使用——git-dir或——work-tree。路径必须被处理以提取相对于工作树顶部的子路径,即使在这种情况下,如果你不使用——选项,git也不会将其识别为路径,所以唯一可能的方法是:
git --git-dir /home/repo/.git log -- subdir
此外,在我的版本(git 1.9.1)中,——work-tree根本不能与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还是一个功能…与通常的许多git设计选择一样。