在尝试将repo镜像到远程服务器时,服务器拒绝树对象4e8f805dd45088219b5662bd3d434eb4c5428ec0。顺便说一下,这不是顶级树,只是一个子目录。
如何找出间接引用该树对象的提交,以便我可以避免推送链接到这些提交的引用,以便让我的所有其余repo正确推送?
答案 0 :(得分:6)
如您所述,您只需要找到具有所需tree
的提交。如果它可能是顶级树,则需要一个额外的测试,但由于它不是,所以不需要。
你想:
使用两个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加快速度,torek对GNU 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"