如何执行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