2011-07-08 15 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

エイリアスの "コマンドライン"の終わり以外に余分なパラメータを適用するには、シェルコマンドをスクリプトに入れる必要があります。外部のスクリプト(jdelStrother’s answerなど)で実行することも、インラインシェルスクリプトを使って実行することもできます。

あなたはgit commitあなたの新しいメッセージを送りか、既存のメッセージや作者を使用できるようにするには-C HEAD/--reuse-message=HEADオプションを使用する-mを使用することができます(それも作者のタイムスタンプを再利用しますが、あなたは--date=…とのことリセットされます)。これらのオプションを使うと、コミットメッセージ用のエディタを開くことができなくなります。この小さなスクリプトのコアは条件付きパラメータ展開のペアがある

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}" 

パラメータ(つまり、あなたの置き換えログメッセージ)は、2つのシェルワード:-m "<your new log message>"に展開されます。余分なパラメータを指定しないと、1つの単語("--reuse-message=HEAD")に展開されます。

末尾のダッシュも重要です。どのシェルワードでもかまいませんが、シェルはシェルを使用して$0パラメータ(通常はデフォルト値を持つため、条件付き展開自体には役に立たない)を初期化するため、何かが存在する必要があります。


私が誤解し、あなたが実際にあなたが単一の拡張${1+-m "$1"}代わりの展開のペアを使用し、その後、追加のパラメータを設定していない場合、エディタを表示したい場合。

+0

--reuse-message = HEADは私が探していたものですが、スクリプトは期待通りに動作していません。コミットコマンドは、パラメータを指定するかどうかにかかわらず、既存のメッセージを使用しているようです。rebaseコマンドは常にエラーを返します。パラメータが指定されていない場合は、「致命的:単一リビジョンが必要です」 上流マスタが無効です。 – ceramica

+0

@ ceramicaそれは私のために働きます(新しいメッセージを与えて、古いメッセージを再利用することと、後続のrebaseを再利用する)のですが、 ' - それは有効ではないので、日付=今日です。代わりに '--date =" $(date "+%s%z") "'を使用しました - エイリアスを作成するのに使ったコマンドは 'git config --global alias.sync ' $ {1 + -m} "$ {1 --- reuse-message = HEAD}" $ {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の元のコードと同様に条件付き実行( '&&')を行いません。 –

関連する問題