簡體   English   中英

git別名ssh-add .gitconfig

[英]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

這次,我:

  • 讓另一個命令打印一些指令
  • 告訴我的遵循這些指示
  • 然后讓我的shell打印出我的shell設置為$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM