git alias ssh-add .gitconfig - PullRequest
       14

git alias ssh-add .gitconfig

0 голосов
/ 16 февраля 2019

В .gitconfig я создал псевдоним этого типа:

[alias]
    something = "!eval `ssh-agent -s` && ssh-add ~/.ssh/id_acub && git config --global user.email <email> && git config --global user.name <user.name>"

На данный момент, запуск git something отображает информацию правильно, но она не работает, как я ожидал.

Если я наберу строку в консоли:

eval `ssh-agent -s` && ssh-add ~/.ssh/id_acub && git config --global user.email <email> && git config --global user.name <user.name>

, тогда все будет хорошо.

Что не так в псевдониме?

1 Ответ

0 голосов
/ 16 февраля 2019

Давайте начнем с более простого примера, чем ssh-agent -s:

$ sh -c 'FOO=bar; echo FOO is now $FOO'
FOO is now bar
$ echo FOO is now $FOO
FOO is now

Почему это не сработало?Почему переменная FOO моей регистрационной оболочки не установлена, когда я устанавливаю переменную FOO другого экземпляра оболочки?

Что ж, я надеюсь, что ответ очевиден: моя оболочка не имеетFOO установлено.Я установил некоторую другую переменную оболочки FOO.Я сказал, что другой оболочка для его печати, и он был установлен.Затем эта другая оболочка завершила работу - завершила работу и вернула управление моей оболочке входа в систему, и когда я сказал моей оболочке входа в систему напечатать FOO моей оболочки входа, она не была установлена.

ssh-agent -s делает распечатывает некоторый набор назначений.Давайте попробуем это:

$ sh -c 'echo FOO=bar'
FOO=bar
$ echo FOO is now $FOO
FOO is now

Конечно, это тоже не сработало, потому что я просто напечатал некоторые инструкции .Никто не следовал этим инструкциям.

Итак, давайте попробуем еще одну вещь:

$ eval `sh -c 'echo FOO=bar'`
$ echo FOO is now $FOO
FOO is now bar

На этот раз я:

  • попросил другую команду напечатать некоторые инструкции
  • сказал моей оболочке следовать этим инструкциям
  • и затем моя оболочка распечатала настройки моей оболочки для $FOO

и так как инструкции, которым я следовал за моей оболочкой, изменили что-то в моей оболочке, сейчас FOO моей оболочки установлена.

Дизайндля ssh-agent то же самое: он выполняет некоторую работу, затем - в различных режимах, в том числе с -s - выводит инструкции для некоторой оболочки, чтобы следовать.Вам нужен eval, чтобы заставить эту оболочку следовать этим инструкциям.

Это все хорошо и выполняет то, что вам нужно, если оболочка, которая следует этим инструкциям, является вашей оболочкой.Но когда вы создаете псевдоним Git, Git запускает новую новую оболочку .Эта оболочка следует инструкциям, и когда она будет выполнена, ваша оболочка не изменится.

Это означает, что вы не можете делать то, что хотите, с псевдонимом Git.Вы должны использовать псевдоним или функцию, которая повлияет на вашу оболочку, а не на такую, которая запустит новую оболочку, повлияет на нее, а затем завершит ее и испарит эти эффекты.

Обратите внимание, чтонекоторые изменения, такие как git config --global, хранятся в файлах , а не в вашей оболочке.Эти изменения не не испаряются, когда оболочка исчезает.Это ключевое отличие: состояние файловой системы хранится вне отдельных процессов.Если бы все ssh-agent было сохранено в состоянии файловой системы, можно было бы заставить работать, но некоторые вещи ssh-agent там не сохраняются.

...