このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

内部を調べる

gitのオブジェクト名(ハッシュ)は40桁

4bcfe98e640c8284511312660fb8709b0afa888e
---------1---------2---------3---------4

詮索用のシェル関数:

# git-test-functions.sh
#
function g_objects {
    gitdir=.git
    if [ "$1" != "" ]; then
	gitdir="$1"
    fi
    (cd $gitdir/objects/; find  -type f) | sed  -e 's@^.@@' -e 's@/@@g'
}

function g_cat {
    if [ "$1" = "" ]; then
	return 1
    fi
    git cat-file -p "$1"
}

function g_type {
    if [ "$1" = "" ]; then
	return 1
    fi
    git cat-file -t "$1"
}

インデックス(ステージングエリア)に関する情報は、

  • git ls-files --stage --debug

以前のインデックスを保存していて表示するには、

  • cp .git/index index.old
  • GIT_INDEX_FILE=index.old git ls-files --stage

差を見るには

  • diff <(GIT_INDEX_FILE=index.old git ls-files --stage) <(GIT_INDEX_FILE=.git/index git ls-files --stage)

ダングリングしているオブジェクトは次で分かる。


$ git fsck
Checking object directories: 100% (256/256), done.
dangling blob 4bcfe98e640c8284511312660fb8709b0afa888e

あと、詮索で使うコマンド

  • git cat-file
  • git ls-files
  • git hash-object
  • git rev-parse 人間が指定するリビジョン(オブジェクトIDの表現)を解決する

[追記]

オブジェクトグラフはHEADからリーチャブルな部分だけが操作対象で、ダングリングした(アンリーチャブルな)オブジェクトはゴミ。

HEADは任意のオブジェクトにロケート(指すようにセット)できるが、通常はHEADは参照を指すようにする。つまり、HEADは参照への参照として使う。HEADがオブジェクトを参照しているときは、「デタッチされた」というようだ。デタッチされると、名前による参照システムが使えなくなる。

HEADは、オブジェクトグラフに対する公式の唯一のエントリポイントだが、実際は参照群(.git/ref/)からエントリーできるので、複数のエントリポイントを持つ有向グラフと考えればいいだおろう。

名前(HEADまたはrefs)からリーチャブルなオブジェクトは(ノードセットとしての)ブランチに属する(含まれる)。それを調べるには(オブジェクト名は例)、

  • git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042
  • git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042 # リモートも含めて

以上はローカルリーチャビリティだが、リモートリーチャビリティも定義できる。リモートリーチャブルなオブジェクト(ノード)は、まずオブジェクトが所属するリポジトリを特定する必要があるが、それはURLで指定する。URLの短縮名がリモート名で、.git/config内の[remote]セクションに書いてある。

[/追記]