1. ホーム
  2. git

[解決済み] 初期コミットを参照するには?

2022-05-15 02:38:24

質問

あるリポジトリの最初のコミットを参照する必要があるスクリプトがあります。 HEAD がありますが、対応する TAIL . には何も見当たりません。 git help rev-parse には、私を助けると思われるようなものは見当たりません。

こんな感じです。

git show TAIL

これは私が持っている一つの選択肢です。

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

これはかなりハチャメチャで、git logの出力が変化しないことに依存しています。

今のところ、私は最初のコミットにタグを付けて、それを私の参照仕様として使っているだけです。 しかし、私は一般的なツールをリリースしたいので、それは良い選択肢ではありません。

どのように解決するのですか?

git-logをスクリプトに使用しない: 以下のいずれかを使用します。 git-rev-list または git-log で、指定されたカスタムフォーマット ( --format=*<sth>* オプション)を指定します。

あなたの質問にはもう一つ問題があります。 一つ以上の このような TAIL ルートコミット (親なしコミット) がリポジトリに存在することがあります (git.git リポジトリの 'html', 'man', 'todo' などの切断されたブランチは除外してもです)。これは通常、別々のプロジェクトを 1 つにまとめたり、別々に開発されたサブプロジェクトのサブツリー マージを使用した場合に発生するものです。

例えば、git リポジトリには 6 つのルートコミットがあります。git-gui、gitk (サブツリー統合)、gitweb (統合され、もはや個別に開発されていない)、git mail tools (プロジェクトの歴史のごく初期に統合)、そして p4-fast-export (おそらく偶然) です。これは、'html' および 'man' ブランチのルート、あらかじめ生成されたドキュメントを含む "convenience" ブランチ、および TODO リストとスクリプトを含む 'todo' ブランチをカウントしていません。


git 1.7.4.2 以降を使用している場合は、git 1.7.4.2以降を使用する際に --max-parents オプションが使えます。

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

そうでない場合は、現在のブランチからアクセスできるすべての親レス(ルート)コミットのリストを取得することができます。

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