likeコマンドを使用して、リモートリポジトリから3つの情報を取得する方法を探していますgit ls-remote
。 .bashrcファイルで実行されているbashスクリプトでこれを使用したいと思いますcron
。現在私がするなら
git ls-remote https://github.com/torvalds/linux.git master
マスターブランチから最後のコミットハッシュを取得しました。
54e514b91b95d6441c12a7955addfb9f9d2afc65 refs/heads/master
コミットメッセージとコミット作成者を取得する方法はありますか?
ベストアンサー1
gitには目的のタスクを実行できるユーティリティはありませんが、はいgitオブジェクトを解析し、作成者とコミットメッセージを出力するPythonスクリプトを書くのはとても簡単です。
stdin
以下は、git commitオブジェクトを使用して作成者を印刷し、コミットメッセージを印刷する例です。
from parse import parse
import sys, zlib
raw_commit = sys.stdin.buffer.read()
commit = zlib.decompress(raw_commit).decode('utf-8').split('\x00')[1]
(headers, body) = commit.split('\n\n')
for line in headers.splitlines():
# `{:S}` is a type identifier meaning 'non-whitespace', so that
# the fields will be captured successfully.
p = parse('author {name} <{email:S}> {time:S} {tz:S}', line)
if (p):
print("Author: {} <{}>\n".format(p['name'], p['email']))
print(body)
break
必要に応じて完全なユーティリティを作成するには、スマートプロトコルを使用して個々のコミットを取得できないため、サーバーはHTTP経由で愚かなgitトランスポートプロトコルをサポートする必要があります。
しかし、GitHubはもはや愚かなトランスポートプロトコルをサポートしていないので、Linusツリーの独自のホスティングコピーを例として使用します。
リモートサーバーがdump http gitトランスポートをサポートしている場合は、カールを使用してオブジェクトを取得し、上記のPythonスクリプトにパイプすることができます。コミットの作成者とコミットメッセージを表示したいと仮定すると、c3fe5872eb
次のシェルスクリプトを実行します。
baseurl=http://git.kyriasis.com/kyrias/linux.git/objects
curl "$baseurl"/c3/fe5872eb3f5f9e027d61d8a3f5d092168fdbca | python parse.py
これにより、次の出力が印刷されます。
Author: Sanidhya Kashyap <[email protected]>
bfs: correct return values
In case of failed memory allocation, the return should be ENOMEM instead
of ENOSPC.
...
コミットのための完全なコミットSHAは、c3fe5872eb
上記c3fe5872eb3f5f9e027d61d8a3f5d092168fdbca
のシェルスクリプトに見られるように、中間にスラッシュがある2番目の文字の後にSHAが分割されます。これは、gitがSHAの最初の2文字の下に名前空間のオブジェクトを格納するためです。それはおそらく、単一のディレクトリに常駐することができるファイルの数に対する古いファイルシステムの制限のためです。
git-show
この回答は、リモートコマンドの完全な動作実装を提供しませんが、単純なコマンドを作成するために必要な基本的な部分を提供します。