2011-07-08 59 views
7

我想確保在我推送前我的最新提交具有當前日期。因爲我總是變基合併+推前掌握,我做了這個別名:具有可選參數的git別名

[alias] 
    sync = !git commit --amend --date=today && git rebase master 

問題是,它不斷推出我的文本編輯器要求一個新的提交信息。有沒有辦法有一個可選的參數,這樣我可以選擇使用:

git sync 'my commit message' 

git sync 

其中,後者將只使用現有的提交信息,不管它恰好是?

+0

可能的重複http://stackoverflow.com/q/3321492/923794 – cfi

回答

12

要將額外參數應用於除別名「命令行」末尾以外的任何內容,您需要將shell命令放入腳本中。您可以使用外部腳本(如jdelStrother’s answer)來完成此操作,也可以使用「內聯」外殼腳本來完成此操作。

您可以使用-m養活git commit新郵件,或使用-C HEAD/--reuse-message=HEAD選項,它使用現有的消息和作者(這也將重用筆者時間戳,但你重新與--date=…)。使用任何這些選項都會阻止Git爲您的提交消息打開編輯器。

這是作爲一個「內聯」 shell腳本:

git config --global alias.sync '!sh -c '\''git commit --amend --date=today ${1+-m} "${1---reuse-message=HEAD}" && git rebase master'\'' -' 

這個小腳本的核心是對有條件的參數擴展的:

${1+-m} "${1---reuse-message=HEAD}" 

當你與一個額外的調用它參數(即您的替換日誌消息),這些參數會擴展爲兩個shell字:-m "<your new log message>"。當您不提供額外參數時,它們會擴展爲只有一個字:"--reuse-message=HEAD"

尾隨短劃線也很重要;它可能是任何shell語句,問題是必須有一些東西,因爲shell將使用它來初始化其參數$0(它通常有一個默認值,所以它對於條件擴展本身沒有用處)。


如果我誤解,你真的想看看,當你不提供額外的參數編輯器,然後使用一個擴展${1+-m "$1"},而不是對擴展的。

+0

--reuse-message = HEAD就是我正在尋找的東西,然而這個腳本並不能滿足我的預期。提交命令似乎使用現有的消息,無論我是否提供參數,並且rebase命令總是返回一個錯誤:當沒有提供參數時,我得到'致命的:需要一個修訂 無效的上游主設備'當參數提供我得到'用法:git rebase ...' – ceramica

+0

@ceramica它適用於我(既提供一個新的消息,並重復使用舊的消息,以及隨後的rebase),但我必須使用除'日期=今天',因爲這是無效的。我使用了'--date =「$(date」+%s%z「)」'而不是 - 我用來創建別名的確切命令是'git config --global alias.sync' !sh -c'\''git commit --amend --date =「$(date」+%s%z「)」$ {1 + -m}「$ {1 --- reuse-message = HEAD} 「&& git rebase master'\'' - ''。 –

+0

我終於得到它的工作,但我必須手動將我的.gitconfig中的別名更改爲:''!sh -c'git commit --amend --date = today $ {1 + -m} \「$ {1 ---'reuse-message = HEAD} \「; git rebase master' - 」'我不知道爲什麼需要額外的引號,但是需要'''分隔命令表明第一個命令失敗。但是,它似乎運作良好。 – ceramica

6

當別名開始變得越來越複雜時,最簡單的方法就是爲它們創建一個單獨的腳本。如果您將文件'git-sync'添加到您的路徑中,則會在您執行'git sync'時自動調用該文件。

所以,如果你創建了一個文件,沿着線的東西 -

#!/bin/sh 

if [ -z "$1" ]; then 
    git commit --amend --date=today 
else 
    git commit --amend --date=today -m "$1" 
fi 
git rebase master 

- 這可能會工作。儘管這是我的頭頂上打字,所以警惕的講師。

+0

這個想法很有道理,但是這個腳本不像OP的原始代碼那樣執行條件執行('&&')。 –