git别名ssh add.gitconfig

git别名ssh add.gitconfig,git,ssh,alias,Git,Ssh,Alias,在.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>" 然后一切顺利 别名有什么问题?让我们从一个比ssh-ag

.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>"
然后一切顺利


别名有什么问题?

让我们从一个比ssh-agent-s更简单的示例开始:

$ sh -c 'FOO=bar; echo FOO is now $FOO'
FOO is now bar
$ echo FOO is now $FOO
FOO is now
为什么这不起作用?当我设置其他shell实例的
FOO
变量时,为什么没有设置登录shell的
FOO
变量

嗯,我希望答案是显而易见的:我的shell没有
FOO
集。我设置了一些其他shell的
FOO
变量。我让另一个shell打印它,它就被设置好了。然后另一个shell退出并将控制权交还给我的登录shell,当我告诉我的登录shell打印我的登录shell的
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
这次,我:

  • 让另一个命令打印一些指令
  • 告诉我的shell按照那些指示去做
  • 然后让我的shell打印出我的shell对
    $FOO
由于我让shell遵循的指令改变了shell中的某些内容,现在shell的FOO已经设置好了

ssh代理
的设计是相同的:它做一些工作,然后在各种模式下,包括使用
-s
-打印一些shell要遵循的指令。您需要
eval
使shell遵循这些说明

这一切都很好,只要遵循这些说明的shell是您的shell,就可以做您想要的事情。但是,当您创建Git别名时,Git本身运行一个新的、不同的shell。该shell遵循说明,完成后,您的shell不受影响

这意味着你不能用Git别名做你想做的事情。您必须使用会影响shell的别名或函数,而不是启动新shell、影响它,然后让它终止并使这些效果消失的别名或函数


请注意,某些更改(例如
git config--global
)存储在文件中,而不是存储在shell中。当外壳消失时,这些变化不会消失。这是一个关键区别:文件系统状态存储在单个进程之外。如果
ssh-agent
所做的一切都存储在文件系统状态,那么它可以正常工作,但是
ssh-agent
所做的一些事情没有存储在那里。

让我们从一个比
ssh-agent-s
更简单的示例开始:

$ sh -c 'FOO=bar; echo FOO is now $FOO'
FOO is now bar
$ echo FOO is now $FOO
FOO is now
为什么这不起作用?当我设置其他shell实例的
FOO
变量时,为什么没有设置登录shell的
FOO
变量

嗯,我希望答案是显而易见的:我的shell没有
FOO
集。我设置了一些其他shell的
FOO
变量。我让另一个shell打印它,它就被设置好了。然后另一个shell退出并将控制权交还给我的登录shell,当我告诉我的登录shell打印我的登录shell的
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
这次,我:

  • 让另一个命令打印一些指令
  • 告诉我的shell按照那些指示去做
  • 然后让我的shell打印出我的shell对
    $FOO
由于我让shell遵循的指令改变了shell中的某些内容,现在shell的FOO已经设置好了

ssh代理
的设计是相同的:它做一些工作,然后在各种模式下,包括使用
-s
-打印一些shell要遵循的指令。您需要
eval
使shell遵循这些说明

这一切都很好,只要遵循这些说明的shell是您的shell,就可以做您想要的事情。但是,当您创建Git别名时,Git本身运行一个新的、不同的shell。该shell遵循说明,完成后,您的shell不受影响

这意味着你不能用Git别名做你想做的事情。您必须使用会影响shell的别名或函数,而不是启动新shell、影响它,然后让它终止并使这些效果消失的别名或函数


请注意,某些更改(例如
git config--global
)存储在文件中,而不是存储在shell中。当外壳消失时,这些变化不会消失。这是一个关键区别:文件系统状态存储在单个进程之外。如果
ssh-agent
所做的一切都存储在文件系统状态,那么它可以正常工作,但是
ssh-agent
所做的一些事情没有存储在那里。

我将我的别名添加到bash配置文件
aliases.sh
,一切都正常工作@torek,谢谢你的解释。我将我的别名添加到bash配置文件
alias.sh
,一切正常@托瑞克,谢谢你的解释。