web-dev-qa-db-ja.com

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

複数の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'

どんな洞察もありがたいです。

164
Stella

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

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

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

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

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

オリヴィエ・ヴェルディエとケビン・バラードが言ったように

[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

59
Brondahl

複数行の非常に複雑な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"

私は投稿を書き、さらにいくつかの例を持っています こちら

22
VitalyB
[alias]
chs = !git branch && git status
17
FractalSpace

これを試してください:

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

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

6
brocksamson

各行の末尾に\を追加することにより、複数行のgitエイリアスを使用することができます。

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

ここでの問題は、位置パラメーターがシェルコマンドに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

これは、最後のエコーコマンドに適用されるときに追加の位置パラメーターを消費し、結果には影響しません。

3
Ben Collins