如何找到指向git树对象的提交?

时间:2016-12-11 15:57:23

标签: git

在尝试将repo镜像到远程服务器时,服务器拒绝树对象4e8f805dd45088219b5662bd3d434eb4c5428ec0。顺便说一下,这不是顶级树,只是一个子目录。

如何找出间接引用该树对象的提交,以便我可以避免推送链接到这些提交的引用,以便让我的所有其余repo正确推送?

2 个答案:

答案 0 :(得分:6)

如您所述,您只需要找到具有所需tree的提交。如果它可能是顶级树,则需要一个额外的测试,但由于它不是,所以不需要。

你想:

  • 用于某些提交集(例如,从给定分支名称可以访问的所有提交)
  • 如果该提交作为子树具有目标树哈希:打印提交ID

使用两个Git“plumbing”命令以及grep

这是微不足道的
#! /bin/sh
#
#  set these:
searchfor=4e8f805dd45088219b5662bd3d434eb4c5428ec0

startpoints="master"  # branch names or HEAD or whatever
# you can use rev-list limiters too, e.g., origin/master..master

git rev-list $startpoints |
    while read commithash; do
        if git ls-tree -d -r --full-tree $commithash | grep $searchfor; then
            echo " -- found at $commithash"
        fi
    done

要检查顶级树,您也可以git cat-file -p $commithash查看它是否包含哈希值。

请注意,相同的代码会找到blob(假设您从-d中取出git ls-tree选项)。但是,没有树可以具有blob的ID,反之亦然。 grep将打印匹配的行,以便您看到,例如:

040000 tree a3a6276bba360af74985afa8d79cfb4dfc33e337    perl/Git/SVN/Memoize
 -- found at 3ab228137f980ff72dbdf5064a877d07bec76df9

要清除它以供一般使用,您可能希望在search-for blob-or-tree上使用git cat-file -t来获取其类型。

答案 1 :(得分:0)

要想通过great answer加快速度,torekGNU Parallel的影响:

#!/bin/bash    
searchfor="$1"
startpoints="${2-HEAD}"

git rev-list "$startpoints" |
    parallel "if git ls-tree -d -r --full-tree '{}' | grep '$searchfor'; then echo ' -- found at {}'; fi"