子树repo的最后一次提交<sha-1>在哪里存储在本地

时间:2016-02-15 06:25:47

标签: git git-subtree

他们说

  

git-subtree存储子项目提交ID而不是元数据中的引用。

这意味着命令

git subtree add --prefix some-split-sub-directory https://some-other-repo-url master --squash

会将主HEAD的SHA-1存储在由{git管理的元数据信息中某处的https://some-other-repo-url

现在我下次运行以下命令时

git subtree pull --prefix some-split-sub-directory https://some-other-repo-url master --squash

git知道在根目录/父项目上合并的URL https://some-other-repo-url上的最后一次提交的SHA-1,现在它获取/合并代码/提交超出最后提交的SHA-1。< / p>

现在我的问题是本地.git文件夹中存储的last-commit-of-subtree的信息在哪里?

我怎么能看到它对这个repo这是最后一次提交的SHA-1存储以及上面/下面的下一次拉/合并将会发生?

我偷看了以下地方,例如.git / config,.git / refs,但没有找到任何信息。

1 个答案:

答案 0 :(得分:0)

我也无法在 .git 文件夹中找到它,但我设法使用以下函数获取它: https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh

AFAICT 它会解析 git 历史以获得最新的相关子树壁球:

find_latest_squash () {
    debug "Looking for latest squash ($dir)..."
    dir="$1"
    sq=
    main=
    sub=
    git log --grep="^git-subtree-dir: $dir/*\$" \
        --no-show-signature --pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
    while read a b junk
    do
        debug "$a $b $junk"
        debug "{{$sq/$main/$sub}}"
        case "$a" in
        START)
            sq="$b"
            ;;
        git-subtree-mainline:)
            main="$b"
            ;;
        git-subtree-split:)
            sub="$(git rev-parse "$b^0")" ||
            die "could not rev-parse split hash $b from commit $sq"
            ;;
        END)
            if test -n "$sub"
            then
                if test -n "$main"
                then
                    # a rejoin commit?
                    # Pretend its sub was a squash.
                    sq="$sub"
                fi
                debug "Squash found: $sq $sub"
                echo "$sq" "$sub"
                break
            fi
            sq=
            main=
            sub=
            ;;
        esac
    done
}