Py学习  »  Git

git别名ssh add.gitconfig

Ant • 5 年前 • 773 次点击  

.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>

然后一切正常。

别名有什么问题?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30771
 
773 次点击  
文章 [ 1 ]  |  最新文章 5 年前
torek
Reply   •   1 楼
torek    5 年前

让我们从一个比 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 变量未设置,当我设置其他shell实例的 变量?

好吧,我希望答案是显而易见的: 我的 壳牌没有 集合。我设置了一些 其他 壳牌公司 变量。我告诉过你 其他 shell把它打印出来,然后就设置好了。然后 其他 shell完成了退出并将控制权还给了我的登录shell,当我告诉我的登录shell打印我的登录shell时 ,未设置。

什么 SSH试剂-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本身运行一个 新的,不同的 壳牌。这个shell遵循指令,当它完成时,您的shell不会受到影响。

这意味着你不能用git别名做你想做的事情。必须使用将影响 你的 壳,而不是一个会启动一个新的壳,影响它,然后让它终止并蒸发这些影响的壳。

注意一些变化,例如 git config --global 存储在 文件夹 而不是在你的壳里。这些变化 不要 当贝壳消失时蒸发。这是一个关键区别:文件系统状态存储在各个进程之外。如果一切 SSH剂 是以文件系统状态存储的,它 能够 是为了工作,但有些事情 SSH剂 不存储在那里。