2016-12-12 1 views
0

/usr/local/libexec/gitにスクリプトを書いて、それを呼び出すエイリアスを作成して、カスタムGitコマンドを作成します。たとえば:ポータブルGitライブラリスクリプトを書くには?

git config --global alias.graph '!/usr/local/libexec/git/git-graph' 

トリッキーな部分は、私は私のスクリプトは、Gitリポジトリをインストールした誰もが遭遇することなく、私は同じようにインストールして、私のスクリプトを実行することができるはずという意味で「ポータブル」になりたいということです依存関係がありません。

重要編集: @ Schwernの回答に従って、もう少し情報を追加する必要があります。 "Gitをインストールした人"を "Gitの公式ソースで提供されているgit-coreスクリプトを使ってGitとやり取りする人"に置き換えてください。たとえば、git rebaseを呼び出すと、.../git-core/git-rebase.shが実行されます。 (最後の単語をクリックすることはできますが、それはハイパーリンクですが、すべてのブラウザでそのようには表示されません)。これはGitプロジェクト自体によって提供されるデフォルトであるため、

私の長年の経験を書いたportable shell scriptsから、これまで存在していたすべてのUnixライクなOS上で実行するには中程度の複雑さのシェルスクリプトも期待するのは無駄だと分かっています。しかし、これらのワークステーション上でスクリプトを書くときには、少なくとも、絶え間なくジャンプして卵殻を歩かないように、少なくともGitワークステーション間に共通のユーティリティーベースが存在すると予想するのが妥当だと思います。 git-coreディレクトリ(例えば/usr/libexec/git-core)のすべてのスクリプトは、Gitのインストールによってそこに配置されて以来変更されていない

  • :ここ

    はGitのワークステーションについての私の想定しています。

  • git-coreのすべてのスクリプトが期待どおりに実行されます(Gitの管理者のワークステーションや「通常」の設定の場合と同じです)。
  • インストールされたGitのバージョンは、スクリプトでサポートすることを決めた任意の最小要件を満たしています。 編集:「任意」とは、「便利」を意味していました。 @Schwernは私が実際にここで言うことを正確に述べていました。

これらのGitワークステーションにポータブルスクリプトを書き込むために使用できるユーティリティの共通基盤を特定するにはどうすればよいですか?

編集:私は基本的にメインのGitのディストリビューションで提供git-coreスクリプト用の依存関係のリストを探しています。これは私が探している共通の基盤を与えるでしょう。

+0

これはgitとは関係がありません。あなたのリンクは、どこからでもうまく動作することがわかっています。ここにあなたを導いた情報が不満足なことはありますか? – jthill

+0

@jthill問題は、Gitについてよりも移植可能なスクリプトを書いていますが、確かにGitに関係しています。基本的には、Gitがインストールされているどのコンピュータでも、私が仮定したことを考慮して見つけることができる一般的なユーティリティ(シェル組み込み関数を含む)を探しています。 'git-core'の内容に見られるように、Gitはこれが真実であることと、特定のバージョンのPythonとPerlがインストールされていることに依存しています。私がリンクしているGNUマニュアルに書かれている助言には 'git-core'が続きません。 – Sam

+1

ところで 'git-p4'はPythonですが、他のすべてのコアスクリプトはPythonではなく、さまざまな" contrib "ディレクトリにあります。これは主にPython2とPython3、そして/またはPythonライブラリのすべての複雑さに依存しないようにすることを前提としています。 – torek

答えて

0

「Gitワークステーション」は、「SVNワークステーション」や「Rubyワークステーション」以上のものはありません。 Gitがインストールされていて、Gitを使って作業したり、プロジェクトを入手したりするマシンです。彼らがWindows環境にいる場合は、Windowsになります。古いSolarisマシンの場合、Solaris環境になります。 Gitは現在OS Xに標準装備されているので、すべてのOS Xマシンは "Gitワークステーション"です。

"Git workstation"にはWindowsが含まれており、Windowsには通常のシェルユーティリティは付属していないため、シェルを使用することはできません。あなたはGit Bashに付属している最小限のセットに頼ることができますが、Git Bashを使用しないWindows/Gitインストールがたくさんあります。代わりに、多くのIDEにGitがバンドルされています。

これは、移植可能なシェルスクリプトを作成する際の互換性の課題を変更するものではありません。 BSD対Gnuと商業的な怪物の動行の両方、そしてWindowsについては何の問題もありますが、それはまだすべて存在します。

サードパーティの拡張機能をインストールする場合、この変更は丁寧なものではありません。彼らは/usrには入っていません。それはシステムのものであり、変更されないままにしておくべきです。彼らは/usr/localまたは~/binのようなものに入ります。 Gitスクリプトは、ユーザのPATHにある場合に動作します。 Gitリポジトリについてのあなたの仮定のいくつかについては


...

のgit-コアディレクトリ内のすべてのスクリプトは、(例えばは/ usr/libexecに/のgit-コア)されて以来変更されていませんGitのインストールによってそこに置かれます。

これは公平な前提です。ここでOS Xには/usr/libexec/git-coreがなく、私は同等のものを見つけることができません。私は彼らがすべてバイナリにコンパイルされていると思う。 Gitはスクリプトのパイルであるとか、MacPortsのような互換性のあるハードリンクはありません。

git-coreのすべてのスクリプトは、期待どおりに実行されます(Gitの管理者のワークステーションや「通常」の設定の場合と同じです)。

、彼らがする必要はありませんを存在する場合は、再度、それは細かい仮定です。

インストールされたバージョンのGitは、スクリプトでサポートすることを決めた任意の最小要件を満たしています。

ではなく任意で、あなたのスクリプトが必要な機能をサポートし、それはあなたのためにあまりにも不便ではない最低限のバージョンを選択します。必ずgit --versionで確認してください。心の中ですべてのことで


は、

  • 直接使用git、いないスクリプトを経由して...移植できるように。
  • ない "Gitは" gitと呼ばれるバイナリ以外のものであると仮定します。
  • ユーザのgitバイナリの場所をインストーラに問い合わせてもらってください。
  • 自分の拡張機能を/ usr/libexecにダンプし、ユーザのPATHのどこかに入れてください。
  • 拡張機能がインストールされる場所のハードコード。
  • Do notシェル内またはUnixユーティリティを使用して何かを書きます。
  • コンパイルされた言語を使用し、バイナリ、またはPerlやPythonやRubyのような一般的なスクリプト言語を提供し、バイナリバンドルを提供します。実際に
+0

"Git workstation"とは、実際にGitがインストールされたコンピュータと、それを正しく機能させるために必要なすべてのビットを意味しました。私は、Gitを実行するためにUnixシェルが必要でないことを実際に知りませんでした。公式のGitソースリポジトリにはコマンドを実装するシェルスクリプトが含まれていることを考慮すると、私は彼らが "それを取るか、それともそれを残す"の上で提供されなければならないと思う...あなたが気にしないことを望むが、私は少し質問を編集するつもりです。私はあなたの洞察に感謝します。 – Sam

+1

実際のスクリプトの場所はMacOSの場合、XCodeが独自の(Appleで修正された)Gitをインストールし、他にもたくさんのバージョンがあるために部分的に異なります。私は最近、 'brew'を使っています。'/usr/local/Cellar/git/2.2.0/libexec/git-core' ...これは古いものです。 :-) – torek

+0

@Samあなたの編集は私の答えを変えません。簡単な答えは、Gitが依存関係としてそれに付属しているものに依存することはできないということです。*** Gitは、これらの依存関係が***になることを保証していないからです。それらはいつでも変更できる内部的な、文書化されていない機能です。異なるディストリビューションに存在するだけでなく、次のバージョンではなくなる可能性があります。 Git自体は移植性の問題から、シェルスクリプトからゆっくりと移行しています。 Git自体はINSTALLに依存関係をリストアップし、非互換性を扱う 'git-sh-setup.sh'を持っています。 – Schwern

2

、スクリプトに建てられたのGitのすべてが(ほとんどshと少数perl、多くがある)というgit-coreディレクトリに住んでいます。 git xxxを実行すると、さまざまな環境変数を設定した後に、git-xxxディレクトリ(通常はgit-coreディレクトリの外)を実行しようとします。たとえば、git --git-dir=/path/to/some/dirGIT_DIR=/path/to/some/dirの設定をエクスポートします。

git-coreディレクトリの正確なの位置は、Gitをビルドするときに設定されます。あなたは実行することによって、それを表示することができます:あなたは自身のスクリプトディレクトリにgit-fooを入れそこにはgit-fooがない場合git fooは、​​を実行しようとする一方であることと

git --exec-path 

注意(それがあなたの上のどこかで$PATH)、git fooの場合、となります。機構が簡単である:gitフロントエンドは$PATHの前面にgitのコアパスを挿入:git-coreディレクトリ内

$ cat << 'end' > $HOME/scripts/git-statusy 
? #! /bin/sh 
? echo statusy: \$PATH is $PATH 
? git status 
? 'end' 
$ chmod +x $HOME/scripts/git-statusy 
$ git statusy 
statusy: $PATH is /usr/local/libexec/git-core:[...snipped] 
On branch master 
... [snipped] 

は、git-sh-setup(q.v.)という名前のファイルがあります。これにはGitが構築されているシステム上の既知の問題のいくつかの便利な機能といくつかの回避策が含まれています。したがって、 "core" Gitスクリプトは常に. git-sh-setupで始まります。 (これは、$PATHの前にgit-coreディレクトリがあるために機能します)。一部の「非コア」contribスクリプトでは、明示的に. $(git --exec-path)/git-sh-setupを実行します。

スクリプト内では、特定のバグ(たとえば、FreeBSD/bin/shmishandles return)を回避する必要がある点を除いて、POSIXシェルの組み込み関数に依存することができます。追加のコマンドのサポートは、基本的には「テストで見つかったもの」をベースにしています。私が知る限り:Gitソースのgit-sh-setup.shと他の.shファイルの履歴を見ると、そのようなもの。

関連する問題