web-dev-qa-db-ja.com

gitエイリアス内に直接bashスクリプトを埋め込む方法

次のbashシェルコードを埋め込むことができます。

for name in $(git diff --name-only $1); do git difftool $1 $name & done

gitエイリアスの作成に直接:

git config --global alias.diffall ***my-bash-code-here***

これは、私の 前の質問/回答 から始まり、コードを.shファイルに入れてからファイルにエイリアスします:

git config --global alias.diffall '!sh diffall.sh'

しかし、単純さを求める終わりのない探求では、ファイルをスキップしてエイリアスにコードを直接挿入する方法がありますか?形式がわからない...

77
git config --global alias.diffall '!sh diffall.sh'

これは、ある意味で冗長です。とにかく「diffall.sh」を$ PATHに追加する場合は、「git-diffall」として保存し、エイリアスを宣言しないようにしてください。はい、「git diffall」で実行されます。

90
u0b34a0f6ae

Gitエイリアス内でコマンドを実行し、特にそれらのコマンドに引数を渡すには、おそらくすぐに呼び出す一時関数を作成する必要があります。

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

この例では、関数はおそらく必要なものです(また、単一の「ステートメント」で実行できることに関してより柔軟です)。そして、おそらく両方のオプションで、gitコマンドの残りの引数は、「エコー」または「f」に関係なく、単にエイリアスに引数として渡されることを伝えることができます。関数を呼び出すと、単に引数が消費され、明示的に使用されていないものは無視されます。

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

別の例(一致するパターンに基づいてすべてのエイリアスをリストします)(注:.gitconfig全体で同じ関数名「f()」を再利用し続けることができます):

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

最初は「foo $」のエイリアスを返し、2番目は「foo。*」のエイリアスを返します。

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(注:実際の結果はシェルによって異なる場合があります。Linux、Unix、およびCygwin(Windows)のbashでこれを使用しています。)

32
michael

ドキュメントには見つかりませんでしたが、パスに「git- <name>」というスクリプトを作成すると、リポジトリで「git name」を使用して呼び出すことができます。

見る:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

したがって、この(やや曖昧な)方法で好きなエイリアスを書くこともできます。

さらに、関数を定義する新しいコマンドにオートコンプリートを追加できます。情報 ここ

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}
24
albfan

これらの2行を.git/configファイルに追加すると、うまくいくはずです。

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

編集:おそらくgit-configバージョンも動作しますが、管理を容易にするためにエイリアスをconfigファイルに保存したいです。

Git wikiには、エイリアスを非常に明確に説明するNiceページがあります: http://git.or.cz/gitwiki/Aliases 特に、読んでください「引数付きの高度なエイリアス」

13
David Claridge