Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
工作树中的Git别名未按Git 2.16中的预期工作_Git - Fatal编程技术网

工作树中的Git别名未按Git 2.16中的预期工作

工作树中的Git别名未按Git 2.16中的预期工作,git,Git,切换到特定Git存储库,然后运行提供的Git命令的Git别名,即: [alias] repo1 = "!f() { cd /path/to/repo1 && git \"$@\" ; } ; f" 如果在Git工作树中执行,则不适用于Git 2.16.2。它在Git2.12.0中运行良好 传递给别名的任何Git命令都将在原始工作树目录中执行,而不是在预期的目标目录中执行 复制步骤: $ mkdir -p /tmp/git $ cd /tmp/git $ mkdir re

切换到特定Git存储库,然后运行提供的Git命令的Git别名,即:

[alias]
    repo1 = "!f() { cd /path/to/repo1 && git \"$@\" ; } ; f"
如果在Git工作树中执行,则不适用于Git 2.16.2。它在Git2.12.0中运行良好

传递给别名的任何Git命令都将在原始工作树目录中执行,而不是在预期的目标目录中执行

复制步骤:

$ mkdir -p /tmp/git
$ cd /tmp/git
$ mkdir repo1 repo2
$ cd repo1
$ git init
Initialized empty Git repository in /private/tmp/git/repo1/.git/
$ touch foo
$ git add foo
$ git commit -m"git log should show this"
[master (root-commit) 6c366be] git log should show this
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
$ cd ../repo2
$ git init
Initialized empty Git repository in /private/tmp/git/repo2/.git/
$ touch bar
$ git add bar
$ git commit -m"git log should NOT show this"
[master (root-commit) 27f9a83] git log should NOT show this
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar
$ git branch new
$ mkdir ../repo2worktrees
$ git worktree add ../repo2worktrees/new new
Preparing ../repo2worktrees/new (identifier new)
HEAD is now at 27f9a83 git log should NOT show this

$ git config --global alias.cdg '!f() { cd /tmp/git/repo1 && git "$@" ; } ; f'

# From inside normal Git repo, works as expected:
$ git cdg log
commit 6c366be9188da3c8f9308ccfe1682c605ff6fed2 (HEAD -> master)
Author: msleigh 
Date:   Tue Jun 12 22:22:06 2018 +0100

    git log should show this

# From outside Git repo, works as expected:
$ cd .. ; git cdg log
commit 6c366be9188da3c8f9308ccfe1682c605ff6fed2 (HEAD -> master)
Author: msleigh 
Date:   Tue Jun 12 22:22:06 2018 +0100

    git log should show this

# From inside worktree:
$ cd repo2worktrees/new ; git cdg log
commit 27f9a83b7f62830b43277517b237e9b22cb9df9c (HEAD -> new, master)
Author: msleigh 
Date:   Tue Jun 12 22:22:42 2018 +0100

    git log should NOT show this
Git bug?如果是这样的话,我有什么想法可以重新编写别名以获得正确的结果


更新


如果我在别名中使用
git-C
,而不是
cd,我应该补充一点;git
,效果是一样的。

可能并不完全是一个bug,这取决于您对其他方面的看法:它可能与git 2.12.0和2.16.0之间的许多其他git worktree和别名相关的修复程序有关。特别是,一些操作需要知道Git目录和工作树“真正在哪里”,因此它们将设置携带该信息的特殊环境变量。如果不设置这些内容,其他命令就会出现错误

如果在环境中设置了
$GIT\u DIR
和/或
$GIT\u WORK\u TREE
,则确定存储库和工作树所在的位置。执行任何
cd
操作都不会取消设置环境变量;它会持续存在于别名的子shell中

您可以自己覆盖这些变量,设置或取消设置环境变量,或使用
--work tree
--git dir
选项。也就是说,而不是:

repo1 = "!f() { cd /path/to/repo1 && git \"$@\" ; } ; f"
您可以将其定义为:

repo1 = "!f(){ git --git-dir=/path/to/repo1.git --work-tree=/path/to/repo1 \"$@\";}; f"
(我在这里挤出了一些空间,使其更适合StackOverflow)或:

repo1 = "!f() { unset GIT_DIR GIT_WORK_TREE; cd /path/to/repo1 && git \"$@\"; } ; f"