4

假设有如下文件夹结构:

repos
    /repo1  <-- here is git repository

我愿意:

cd repos

我现在如何在/repo1仍然在repos目录中使用存储库?我不想做

cd repo1
git status (...)
git commit (...)
...

但类似:

git --git-dir=repo1 (...)

或者

git --work-tree=repo1 (...)

我想以这种风格执行所有git 命令, event git init。什么是正确的方法?

4

3 回答 3

4

您可以设置环境变量$GIT_DIR。查一下。

于 2012-11-17T13:54:12.757 回答
3

Git 具有将 Git的工作目录更改为然后在该目录中执行命令的-C <path>选项(如)。示例运行:tar -C <path>path

$ mkdir gitrepo
$ git -C gitrepo init
Initialized empty Git repository in /home/foo/gitrepo/.git/

man git

-C <path>

就像启动 git<path>而不是当前工作目录一样运行。当给出多个-C选项时,每个后续的 non-absolute-C <path>都相对于前面的-C <path>.

此选项影响期望路径名的选项--git-dir--work-tree因为它们对路径名的解释将相对于由该-C选项引起的工作目录。例如,以下调用是等效的:

git --git-dir=a.git --work-tree=b -C c status
git --git-dir=c/a.git --work-tree=c/b status

我的 Git 版本是 2.16.1。

于 2018-02-10T11:38:10.127 回答
2

您可以组合--git-dir--work-tree在当前目录之外的 repo 上进行操作:

git --git-dir=/some/other/dir/.git --work-tree=/some/other/dir status

您也可以设置GIT_DIR为提到的@opqdonut,但您还必须设置GIT_WORK_TREE. 请注意,这是目标存储库中目录GIT_DIR的路径,并且是目标存储库本身。.gitGIT_WORK_TREE

这一切都非常方便,但这里有一个 shell 函数可以让你的生活更轻松:

function git-dir() {
    dir=$1
    shift
    git --git-dir="$dir/.git" --work-tree="$dir" $*
}

这将适用于 Bash 或 Zsh(可能还有其他 Bourne 派生的 shell)。将它放在您的~/.bashrc~/.zshrc适合您环境的任何地方。

然后你可以这样做:

git-dir /some/other/dir status

status任何 Git 命令在哪里。它也适用于其他参数,这些参数直接传递给git命令:

git-dir /some/other/dir remote -v
于 2013-08-13T15:39:44.970 回答