git [アクション]コマンド(スペースを含む)のエイリアスを作成するにはどうすればよいですか?


29

私のエイリアスのほとんどは次の形式です。 alias p='pwd'

git commitはそれがするようにエイリアスしたいgit commit -v

ただし、スペースを含むエイリアスを作成しようとするとエラーが発生します。

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

回答:


31

あなたの質問に対する直接的な答えではありません(エイリアスは1つの単語にしかなれないため)が、git-config代わりに使用する必要があります:

git config --global alias.civ commit -v

これにより、git civ実行されるgitエイリアスが作成されますgit commit -v。残念ながら、私の知る限り、既存のgitコマンドをaliasesでオーバーライドする方法はありません。ただし、代わりに使用する適切なエイリアス名をいつでも選択できます。


答えgit configないために追加されたメモを参照してくださいgit-config
マイケルデュラン

この回答あなたは明確にリンクされていることスレッドに、ある既存の上書きすることが可能にgitシェルスクリプトのほんの少しで、別名でコマンドを。(。!私はところで、批判としてこのコメントを投稿していないよ答えはあなたの後一年近く掲載されたことを私はちょうど人々はそれが役に立つかもしれませんことを期待して、それを掲示しています。)
sampablokuper

17

スペースを含むコマンドについて話していますが、ここではコマンドがgitあり、スペースはありません。

git commitコマンドを呼び出すには、それを書く必要があります

git\ commit ...
'git commit' ...
"git commit" ...

一般に、コマンドの名前にはスペースがありません。そのため、シェルでコマンドを呼び出すのは面倒なので、システムでそのようなコマンドを見つけることはないと思います。

csh、tcsh、またはzshは、上記のいずれかのエイリアスを許可しますが、bashまたはkshはエイリアスできません(ただし、pdkshでは許可されますが、使用は許可されません)。zshの場合:

alias "'git commit'=git commit -v"
'git commit' ...

なりますgit command(として呼び出されたときにコマンドを'git command'単一引用符()でのみ)のエイリアスをgit持つコマンドcommit-v引数を指定します。あなたが探していたものではありませんが、私は推測します。

コマンドのaliasエイリアスしかできないので、ここでエイリアスできるのはコマンドだけgitで、引数のリストで「コミット」の後に「-v」を挿入するものにエイリアスする必要があります。@ jw013のソリューションを使用するのが最善ですが、何らかの理由でエイリアスを使用する代わりに、できない、またはできない場合は、関数を使用してジョブを実行できます。

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
スペースまたはその他の特殊文字を含むエイリアスを許可することは、Bourneスタイルのシェルには存在しないcsh機能です(zshは奇妙な方法でエミュレートします)。Bourneスタイルのシェルは、最初の単語が何らかの方法で引用されている場合、エイリアス展開を無効にします。Renanの答えを参照してください。
ジル「SO-悪であるのをやめる」

はい。だから、そのバグがないcsh、tcsh、zshでしか機能しないと言ったのです。Bourneシェルはエイリアスをサポートしていないことに注意してください。エイリアスはcshによって導入されました。
ステファンシャゼル

9

Bashでは、空白を含むコマンドのエイリアスを作成できません。
ただし、回避策として.bashrcで次の関数を使用します。

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

仕組みは次のとおりです。まず、呼び出したいコマンドから始めます。私の場合、そうですsudo
次に、どのパラメーターを取るかを指定します。この場合、pacman -Syu
トリガーされた場合、どのコマンドを実行する必要がありますか?上記のステートメントでは、pacup.shです。
それ以外の場合、実行するコマンドは何ですかsudo $@$@あなたが推測するように、コマンドが取るパラメータリストです。

したがって、特定の場合にコマンドを作成すると、次のようになります。

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

ただし、このソリューションは、空白を含むコマンドをエイリアスする場合のより一般的なケースです。
あなたの特定のケースでは、jw013のソリューションを使用してgitコマンドのエイリアスを使用することをお勧めしますgit-config


じゃないif [[ $1 == 'commit' ]]...?$ @を展開すると、実際に保持したいコミットの引数が増える可能性があります。
小次郎

右!私の悪い..私は自分のシステムに使用していたステートメントを単に変更しました。
-darnir

これはすごいです-ありがとう-必要なものに最適です。
-cgseller

4

bashのエイリアスのmanページ

各単純コマンドの最初の単語は、引用符で囲まれていない場合、エイリアスがあるかどうかが確認されます。その場合、その単語はエイリアスのテキストに置き換えられます。エイリアス名と置換テキストには、シェルメタキャラクターを含む有効なシェル入力を含めることができますが、エイリアス名に「=」を含めることはできません。

置換テキストの最初の単語はエイリアスがテストされますが、展開されるエイリアスと同じ単語は2回展開されません。これは、たとえばlsを "ls -F"にエイリアスでき、Bashは置換テキストを再帰的に展開しようとしないことを意味します。

そのため、最初の単語のみがチェックされるため、複数の単語を含むエイリアスを持つことはできません。で、このスーパーユーザーの質問、機能を使用して回避策が提供されます。

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

に適応させることができますgit


このリンクは、私が持っているbashのドキュメントとは異なり、bashの動作と矛盾しているようです。上記の例では、エイリアス名にはスペースを使用できます。そのページが明示的にbashと言っていても、zshの動作に似ています。
ステファンシャゼラス

2
@sch Bourne / POSIXシェルは、単語が何らかの方法で引用されている場合、エイリアス展開をバイパスします。たとえば\ls、のエイリアスをバイパスしlsます。
ジル「SO-悪であるのをやめる」

1
@Gilles。Bourneシェルはエイリアスを実装しません。POSIXは、有効なエイリアス名(ASCII alnum +のみ[_!%,@])に一致する引用符で囲まれていない単語は展開されると述べています。zshのエイリアス '\ ls'やksh / dash / bash / zshのエイリアスのような拡張は禁止されていません。a-bそうでなければ、単一のPOSIXシェルは存在しません。移植性のあるスクリプト(シェルではない)がそのようなエイリアスを使用するべきではないというだけです。
ステファンシャゼル

2
@sch POSIX では、実装でエイリアスで他の文字を使用できます、単語の一部を引用符で囲むと、エイリアスの展開が禁止されます'git commit'POSIXシェルでコマンド位置に書き込む場合、組み込みユーティリティ、関数、または外部コマンドを呼び出す必要があります。
ジル「SO-悪であるのをやめる」

0

正しい解決策は、推奨されるjw013のようなエイリアスを使用することですが、スペースでエイリアスを作成するには、エイリアスをネストできます。

たとえば、ローカルとリモートの両方でブランチを削除するエイリアスがありますが、ユーザーは常にブランチを指定する必要があります。

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

この例から、これは機能するはずです:

したがって、sudoをシャットダウンではなく他のコマンドで引き続き使用したい場合、およびシャットダウンを別のものにエイリアスする余裕がある場合は、次のようにすることができます。

alias sudo='sudo '
alias shutdown="echo nope"

しかし、あなたのコマンドで:

alias git='git '
alias commit="commit -v"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.