最初のコミットを参照するには?


131

リポジトリの最初のコミットを参照する必要があるスクリプトがあります。gitには特別な参照HEADがありますが、対応するはありませんTAILgit help rev-parse助けになりそうなものは何も見つかりません。

これが私がしたいことです:

git show TAIL

ここに私が持っている1つのオプションがあります:

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

これはかなりハックで、変更されないgit logの出力に依存しています。

現在、私は最初のコミットにタグを付け、それを自分のrefspecとして使用しています。ただし、一般的なツールをリリースしたいので、あまり良い方法ではありません。

回答:


151

スクリプトにgit-logを使用しないでください。を使用するかgit-rev-listgit-log指定したカスタム形式(--format=*<sth>*オプション)を使用してください。

あなたの質問には追加の問題があります:git.gitの「html」、「man」、「todo」などの切断されたブランチを無視しても、リポジトリにそのようなTAILルートコミット(親なしコミット)が複数存在する可能性がありますリポジトリ)。これは通常、個別のプロジェクトを1つに結合するか、個別に開発されたサブプロジェクトのサブツリーマージを使用した結果です。

たとえば、gitリポジトリには6つのルートコミットがあります:git-gui、gitk(サブツリーマージ)、gitweb(マージされ、個別に開発されなくなりました)、gitメールツール(プロジェクト履歴の非常に早い段階でマージされました)、およびp4-fast-export(おそらく偶然)。これは、「html」ブランチと「man」ブランチのルート、事前に生成されたドキュメントを含む「便利」ブランチ、およびTODOリストとスクリプトを含む「todo」ブランチの数を数えていません。


git 1.7.4.2以降を使用している--max-parents場合は、次のオプションを使用できます。

$ git rev-list --max-parents=0 HEAD

それ以外の場合は、次のコマンドを使用して、現在のブランチからアクセス可能なすべての親のない(ルート)コミットのリストを取得できます。

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

私にとって、git rev-list HEAD | tail -n 1およびgit rev-list --max-parents=0 HEADは同じハッシュ値を返していません。を使用しているもの--max-parents=0は、実際には最初のコミットを取得しています。後者の方が信頼性が高いように思えます。
jbranchaud 2013年

1
@Treebranchこれは、奇妙なタイムスタンプを持つコミットがある場合に発生する可能性があります。に追加--topo-orderすることrev-listで修正されるはず--max=parents=0ですが、答えは最良だと思います。
jthill 2013年

35

git rev-list HEAD | tail -n 1 より安定したオプションです。


14
これは、テールコミットの1つを返します。複数のルート(親のない)コミットが存在する可能性があります
JakubNarębski'06 / 06/17

この回答は完全に機能し、1つのコミットのみを返しましたが、git rev-list --max-parents=0 HEAD3 つのコミットを返しました。
protoEvangelion

tailは、Windowsにデフォルトで存在するコマンドでもありません。ただし、WindowsのGitBashで動作します。:)
ジョニー・スコブダル2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.