Git псевдоним в рабочем дереве не работает, как ожидалось в git 2.16 - PullRequest
0 голосов
/ 13 июня 2018

Псевдоним Git, который переключается в определенный репозиторий Git, а затем запускает предоставленную команду Git, то есть:

[alias]
    repo1 = "!f() { cd /path/to/repo1 && git \"$@\" ; } ; f"

не работает с Git 2.16.2, если выполняется внутри рабочего дерева Git.В Git 2.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?Если да, то есть ли идеи, как мне переписать псевдонимы для достижения правильного результата?


Обновление

Я должен добавить, что если я использую git -C <destination> <command>в псевдониме вместо cd <destination> ; git <command> эффект тот же.

1 Ответ

0 голосов
/ 13 июня 2018

Вероятно, это не совсем ошибка, в зависимости от того, что вы думаете о других вещах: она, вероятно, связана с рядом других git worktree и связанных с псевдонимами исправлений между Git 2.12.0 и 2.16.0.В частности, некоторые операции должны знать, где на самом деле находятся каталог и рабочее дерево Git, поэтому они будут устанавливать специальные переменные окружения, которые переносят эту информацию.Без установки этих параметров, другие команды будут плохо себя вести.

Если $GIT_DIR и / или $GIT_WORK_TREE установлены / установлены в среде, это определяет, где находятся хранилище и рабочее дерево.Выполнение любой cd не un -установки переменной окружения;он сохраняется в под-оболочке для псевдонима.

Что вы можете сделать, это переопределить их самостоятельно, установив или удалив переменные окружения или используя опции --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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...