[英]git alias ssh-add .gitconfig
在.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>
然后一切正常。
別名有什么問題?
讓我們從一個比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
變量未設置,當我設置一些其他的殼實例的FOO
變量?
好吧,我希望答案是顯而易見的: 我的外殼沒有FOO
設置。 我設置了其他一些Shell的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
在內) 打印出要遵循的一些shell 指令 。 您需要eval
才能使該Shell遵循那些說明。
只要遵循這些說明的外殼就是您的外殼,那一切都很好,並且可以滿足您的需求。 但是,當您創建Git別名時,Git本身會運行一個新的,不同的 shell。 該外殼程序將按照說明進行操作,完成后,您的外殼程序將不受影響。
這意味着您無法使用Git別名來做您想做的事情。 您必須使用一個會影響您的 Shell的別名或函數,而不是一個會啟動新的Shell,影響它,然后終止它並使這些效果消失的別名或函數。
請注意,某些更改(例如git config --global
)存儲在files中 ,而不是存儲在您的shell中。 當外殼消失時,這些變化不會消失。 關鍵區別在於:文件系統狀態存儲在各個進程之外。 如果ssh-agent
所做的所有事情都存儲在文件系統狀態中,則可以使其正常工作,但是ssh-agent
所做的某些事情並未存儲在那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.