Gitエイリアス-複数のコマンドとパラメーター


182

複数のGitコマンドと定位置パラメーターの両方を使用するエイリアスを作成しようとしています。それぞれにStackoverflowページがあり、両方を実行するのは非常に明白なように見えますが、問題があります。

例として、ブランチfooに切り替えてステータスを実行したいとします。だから、私の.gitconfig中では:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

これは機能しません。一方、このようなものが機能します。

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

どんな洞察もいただければ幸いです。


私のエイリアス:git config --global alias.go '!git commit -a && git pull --rebase && git push && git status'。注:単純な引用符を使用してください。
マーカスベッカー

回答:


157

これは動作します(zshとbashでテスト済み):

[alias] chs = !git checkout $1 && git status

1
いいえ、ありません。Gitは次のように変形git chs fooしますgit checkout && git status foo
リリーバラード

24
興味深いことに、gitは実際には現在、シェルエイリアスに位置変数を入力しています。しかし、それはまた、彼らを議論として結び付けているので、まだ壊れています。のエイリアスはecho $1 && echo done、引数「foo」で呼び出されると、「foo」と「done foo」の両方を出力します。
リリーバラード

7
の最初の呼び出しでの前の感嘆符は何gitですか?
Elijah Lynn

21
@ElijahLynn:gitエイリアスでは、先行!はすべてをシェルに渡すことを意味します。それ以外の場合は、別のgitコマンドを実行しようとしていると想定し、それを引数としてgitバイナリに渡します。
リリーバラード

2
@ブロンダール・クレバー。;:代わりに私はお勧めし&& :ます。そして、それはunixでもうまくいきます。
リリーバラード

82

これはWindowsバッチ/ msysgit bashを対象としています。他の環境では機能しない可能性があります。

Olivier VerdierとLily Ballardが言ったように

[alias] chs = !git checkout $1 && git status

ほとんど機能しますが、引数の偽の追加挿入を与えます...

git chs demo -> git checkout demo && git status demo

ただし&& :、エイリアスの末尾に追加すると、偽の引数がロケーションタグに消費されます。

そう

[alias] chs = !git checkout $1 && git status && :

正しい出力を与えます... git chs demo -> git checkout demo && git status


9
&& :金で、余分な引数が問題となるコマンドについては、このソリューションの作業を行います。
クレイ

3
@Clay(または他の誰か)-誰かがBASHに挑戦した人に何を説明できる&& :か?
Justin Morgan

7
@JustinMorgan &&は、前のコマンドが0(成功)になった場合、&&の後にコマンドを実行することを意味します。「:」、コロンは、引数を拡大し、リダイレクトを実行超えて何もしないシェルの組み込みコマンド、であるとステータスを返す0 Here'reいくつかの使用法:1. a=123;$aエラーが、a=123; : $aしません。2. : > hello.txthello.txtを空にします。3.正常にif [ "$a" = "hello" ];then : ;fi実行されますが、「:」なしでエラーが発生します。passPython のようなものです。4. : this is a comment、コロンの後にスペースが続く場合#は、コメント行のように機能します。
ElpieKay 2016年

2
これはそのようなハックです... gitは複数のコマンドモードを受け入れる必要があります
kchoi

1
説明してくれてありがとう@ElpieKay。1つのプロジェクトの私のローカルgitエイリアスはco = !git checkout public/compiled && git checkout $1、私がそうしたときにgit co masterメッセージを受け取りますerror: pathspec 'master' did not match any file(s) known to git.。私がこの回答が最初に言及するのはWindowsであり、私はLinuxを使用しているので、この回答が私に役立つとは思いませんでした。しかし、その理由を説明しました。
タイラーコリアー

73

シェル関数を定義できます。

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

これを別のstackoverflowページで見ましたが、私のcygwinターミナルは、実行しようとすると関数が認識されないと表示しています。
Stella

@Stella:この構成ファイルの構文では役に立たない、最後の引用符を残しました。あなたがそれを持っていなかったことを確認してください。
リリーバラード

2
うわー...残念ながら、これはすべてバージョンの問題でした。私はGit 1.7.3を使用していましたが、どちらの方法も機能しませんでした。私は1.7.6にアップデートして出来上がり、すべてがうまくいきました。みんなありがとう!
Stella

5
Windowsを使用している場合、シェル関数の定義を二重引用符で囲む必要があると思います"
drzaus

4
Olivierの答えは、パラメーター(OSX)を使用してもうまくいきませんでした。これは完全に機能しました。
Ohad Schneider

25

複数行の非常に複雑なgitエイリアスを作成できました。Windowsでは問題なく動作しますが、たとえば次のように他の場所でも動作すると思います。

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

私は投稿を書き、ここにいくつかの例があります


2
これに対する1つの改善点は!f() { : reset、リセットコマンドgithub.com/git/git/blob/master/contrib/completion/…
ユーザーの

よくやった!その記事はどのライセンスの下で公開されていますか?その一部をロシア語のStackOverflowに翻訳してもよろしいですか?
Nick Volynkin

@NickVolynkin返信が遅くなってすみません。ありがとうございました。もちろん続行してください:)
VitalyB '30

22
[alias]
chs = !git branch && git status

8
何の!ためですか?
AutonomousApps

1
私はのドキュメントを見つけることができませんでした!が、デフォルトでgitを確認できる限り、エイリアスはgitコマンドであると想定しているため、t = status機能します。ただし、試しt = git statusても機能しません(「git」コマンドが見つからないと表示されます)。そのため、が入って!くると、それがシェルであるかのようにコマンドを実行するように指示します。通常、エイリアスごとに複数のgitコマンドがある場合はこれが必要t = !git status && git logになるため、たとえば、それを使用できます。
ローレント

Gitエイリアスの感嘆符(!)を処理するStackOverflowの質問は次のとおりです:stackoverflow.com/questions/21083933/…
Jacob Lockard

6

これを試してください:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

次のように呼び出します。 git chs master


6

\各行の最後に追加することで、複数行のgitエイリアスを使用できます。

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
ありがとう!私は実際には"!git fetch --prune --all; git pull --rebase upstream master; git push origin master"自分のエイリアスに使用しても問題ありませんでした。
Droogans 2014

3

ここでの問題は、位置パラメーターがシェルコマンドに2回送信されているように見えることです(git 1.9.2以降)。私の意味を確認するには、これを試してください:

[alias]
  test = !git echo $*

次に、行いますgit test this is my testing string。次の出力を確認する必要があります(明確にするために、ここで編集された最後の2行)。

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

これを回避する1つの方法は、

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

これは、最後のエコーコマンドに適用され、結果に影響を与えないため、余分な位置パラメーターを消費します。

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