web-dev-qa-db-ja.com

初期コミットを参照する方法は?

リポジトリの初期コミットを参照する必要があるスクリプトがあります。 gitには特別な参照HEADがありますが、対応するTAILはありません。 git help rev-parseで私に役立つと思われるものが見つかりません。

これが私がやりたいことです:

git show TAIL

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

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

それはかなりハックで、git logの出力が変わらないことに依存します。

今のところ、最初のコミットにタグを付けて、それをrefspecとして使用しています。ただし、一般的なツールをリリースしたいので、それは素晴らしいオプションではありません。

118
Bryan Larsen

スクリプティングにgit-logを使用しないでください。指定されたカスタム形式( "--format =<sth>」オプション)。

あなたの質問には追加の問題があります:複数リポジトリにそのようなTAILルートコミット(親なしコミット)が存在する可能性があります(たとえ「html」、「man」、 git.gitリポジトリの「todo」)。これは通常、個別のプロジェクトを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}$"
137
Jakub Narębski

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

30
Robert Munteanu