考虑以下情况:
我有一个项目的源代码(几个文件夹和文件)。不幸的是,源代码不受版本控制。 但是,这个项目有一个远程git存储库。
如何在git存储库中找到与我的项目修订版对应的提交?
我的蛮力方法是:克隆存储库,在不同的提交中签出,并将签出的文件与我的文件进行比较。
是否有更优雅的方式来查找提交?
答案 0 :(得分:4)
我认为两种明显的方法都不可用(查看VERSIONS / README文件,或在您下载的tar.gz文件中查找版本号)。
您可以尝试以下方法。它会明显更快,因为它可以避免结账。只有在您没有以任何方式修改源代码时它才会起作用。
git init
新存储库git add
您的所有来源副本,然后是git commit
git rev-parse HEAD^{tree}
获取代码对应的树-SHA 现在git clone
远程,然后在该repo中执行类似
# This should be the tree-SHA given by the above
needle=ABCDEF12345
# you could limit this to just HEAD or a branch if you had a guess
for rev in $(git rev-list --all)
do
if [ $(git rev-parse ${rev}^{tree}) = ${needle} ]
then
echo "Sha ${rev} matches"
fi
done
获得匹配的SHA后,您可以尝试使用git tags --points-at
答案 1 :(得分:2)
是的,您可以利用git ID是对象的校验和。提交校验和是目录的内容,这很好,但它们也是日志消息,提交日期以及其他无法重现的内容。
Git还将目录的内容(即所有文件和目录)存储为树对象。它还有一个ID,它是内容的校验和。内容相同,校验和相同。您可以重现此校验和。这是怎么回事。
在mystery目录中初始化一个新存储库。添加并提交所有文件。然后使用以下命令检查其树形哈希:
pos
然后返回真实存储库,在历史记录中搜索具有相同树的提交。
git log --pretty=format:'%T'
需要注意的是, 神秘文件必须完全相同,并且必须包含所有文件 。甚至是git log --pretty=format:'ID: %H Tree: %T %s'
。它还必须具有相同的权限(尽管不是相同的所有者)。
完成后,您可以从神秘存储库中删除.gitignore
目录,但更有可能将其替换为克隆并检出正确的版本。
如果这不起作用,因为目录不完全相同,您可以使用类似的技术通过使用单个重要的,经常编辑的文件的校验和来归零一系列提交(git调用一个“blob”)。在你的神秘资料库中,做
.git
然后,您可以在项目历史记录中搜索该哈希值。 That's covered in this answer