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


82

次の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***

これは、SOに関する以前の質問/回答から導き出されたもので、コードを.shファイルに入れてから、ファイルのエイリアスを作成しました。

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

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

回答:


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

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


1
それ。素晴らしいです。gitを実行するためのシェルスクリプトをいくつか作成し、プレフィックス「git-」を付けたので、最初は誤って何かを実行するのではないかと心配していましたが、シェル(zsh)はそれらをオートコンプリートしないので、それらを明示的に入力する必要があります。オートコンプリートの動作が必要な場合は、独自のサブコマンドへのgitエイリアスを宣言できます。これは、スクリプトからサブコマンドへのリンクを明示的にするための要件でもあります。
ジョンカーター

1
! binary

1
エイリアス内で使用すると、が表示さ!sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')/usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary fileます。sh最初に、ある場合とない場合の両方で試してみました。
ハイエンジェル

36

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

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

この例では、関数はおそらく必要なものです(また、単一の「ステートメント」で実行できることに関してより柔軟です)。どちらのオプションでも、gitコマンドの残りの引数は、「echo」か「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"

1つ目は「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

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


git.wiki.kernel.org/index.php/Aliases#What.27s_new.3Fは、暗黙的に使用を推奨しsh -cています。これにより、ユーザーのログインシェルが何であるかを心配する必要がなくなります。
2016年

私が提供した関数構文は、かなりの数のシェル(sh / ksh / bash / zsh)間で意図的に移植可能であり、サブプロセスを起動するよりも高速です。特定のプラットフォームで特定の移植性の問題がない限り、引き続き関数構文を使用することをお勧めします。
マイケル

あなたのコメントは私をこの答えに戻しました、そして私はおそらくあなたのやり方を使うつもりです。それは見積もりの​​1つのレベルを節約します、そしてそれらのレベルはそれがそうであるように十分に狂っています。:-)
2017年

これはあなたがしていることを説明する素晴らしい記事のように見えます:atlassian.com/blog/git/advanced-git-aliases
Gabriel Staples

注:この回答に関するフォローアップの質問をここに投稿しました:stackoverflow.com/questions/52123145/…。「などの内部gitコマンドgit statusをカスタムエイリアスに置き換える方法」
Gabriel Staples

24

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

見る:

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

+1、それはgitlibexecフォルダーからのみ機能すると思いました。このヒントを共有していただきありがとう
ござい

14

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

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

編集:おそらくgit-configバージョンも機能しますが、管理を容易にするためにエイリアスを構成ファイルに保持したいと思います。

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


git config --globalは、エイリアスを$ HOME / .gitconfigに保存します。ここで、(IMO)の管理はさらに簡単です。エイリアスをリポジトリ固有にする必要はほとんどありません。(リポジトリ固有はrepo / .git / configに移動します)
u0b34a0f6ae 2009

Davidに感謝しますが、それは私にはうまくいきません-それまたはあなたが含めた素晴らしいリンクのバリエーションのいずれか。たぶん私はWindows環境で実行していると言うべきでしたか?カイザーに感謝し、同意しました。これは私にとって「グローバル」です。
Seba Illingworth

最近では、git.wiki.kernel.org / index.php / Aliases#Advanced最適な場所です。(gitまたはczリンクはそこにリダイレクトしますが、このセクションでは特に、引数を使用して複雑なものを実行することに言及しています)
clacke 2016年

-4

(ProGitドキュメントから:http://progit.org/book/ch7-3.html )

.git / hooksにスクリプトを追加しようとしましたか?

たとえば、スクリプト.git / hooks / post-checkoutを作成する場合:

#!/bin/bash

echo "This is run after a 'git checkout'"

次に、次のコマンドを実行します。

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'

3
フックは、構成、拡張機能、およびエイリアスと何の関係がありますか?
スティーブブゾナス2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.