2014-02-19 46 views
2

很長一段時間,我在我的別名下面的別名文件:回聲在gitconfig別名呼應的命令行參數的整個列表時,只有一個預期

ignore=!([ ! -e .gitignore ] && touch .gitignore) | echo $1 >>.gitignore 

這不是原來的我了,如果你搜索它,你會看到很多地方。然而,最近我開始對別名有一個奇怪的問題。我忽略的任何東西都放在.gitignore文件中並放在同一行(僅限一個空格)。

我做了一些調試,發現真正發生的事情是,對echo $1的調用正如您所期望的那樣呼應$1,但也會將別名的整個參數字符串回顯。

爲了測試這一點,我做了一個新的別名:

eo = !echo $1 

> git eo test 
test test  

> git eo test0 test1 
test0 test0 test1 

最後一行是最有趣的,因爲它清楚地表明,回聲通話越來越整套上漲到它的參數的同時$1是正確評估。事實上,如果我惹的事,改變$1$9(不填$9),我得到:

> git eo test0 test1 
test0 test1 

我已經證實,這種情況在Git的版本1.8.5至1.9.0和我已經證實它不會發生在Git 1.7.1版本中;不幸的是,我無法在1.7.1和1.8.5之間進行測試。

有沒有人有任何見解這裏發生了什麼?它打破了我的幾個別名...

回答

3

我認爲擴展不是你所期望的。讓我們先從您的別名:

eo = !echo $1 

我相信git eo test被擴展爲:

echo $1 test 

然後擴展到:

echo test test 

的典型方法混帳着眼於別名當我說「eo」時,我想讓你運行「echo $ 1」並將所有參數傳遞給該命令。這允許你做一些事情,如

[alias] 
k = !gitk 

仍然能夠將參數傳遞給git k。如果你希望它的行爲有所不同,你應該像下面這樣通過shell調用:

[alias] 
eo = !sh -c 'echo $1' - 

然後你會得到預期的結果。

我想你忽略的別名,你要像

[alias] 
ignore = !sh -c 'echo "$1" >> .gitignore' - 

注意:您無需觸碰文件>>工作,並在原來的別名,你可能是指使用;代替將觸摸輸出轉換爲回聲。

+0

'ignore =! >> gitignore echo'可能也可以工作(並且允許你一次將多個文件添加到你的忽略文件中) – knittl