如何找到对应于不受git控制的项目修订的提交?

时间:2016-03-28 18:38:39

标签: git

考虑以下情况:

我有一个项目的源代码(几个文件夹和文件)。不幸的是,源代码不受版本控制。 但是,这个项目有一个远程git存储库。

如何在git存储库中找到与我的项目修订版对应的提交?

我的蛮力方法是:克隆存储库,在不同的提交中签出,并将签出的文件与我的文件进行比较。

是否有更优雅的方式来查找提交?

2 个答案:

答案 0 :(得分:4)

我认为两种明显的方法都不可用(查看VERSIONS / README文件,或在您下载的tar.gz文件中查找版本号)。

您可以尝试以下方法。它会明显更快,因为它可以避免结账。只有在您没有以任何方式修改源代码时它才会起作用。

  1. git init新存储库
  2. git add您的所有来源副本,然后是git commit
  3. git rev-parse HEAD^{tree}获取代码对应的树-SHA
  4. 现在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