从对象哈希中查找git历史记录和当前文件路径

时间:2014-02-03 22:01:01

标签: git

鉴于blob对象的哈希值(可能是在以前的版本中采用),如何找到

  • 历史和
  • 当前版本中相应文件的路径?

用例的一些细节:

我们使用git存储库来存储作为文档生成一部分的文件。

文件随时间而变化(因此repo;))。保存文件并参考仓库中的文件。

为保持一致性,保存的文档将在创建文档的时间点引用文件版本。

所以我认为保持对象哈希应该足够,因为这可以准确识别使用的文件版本。

但是,我现在面临以下问题:我想建议将文档升级到较新版本的文件。所以我必须

  • 找出是否有新版本
  • 因为使用命令行工具生成文档,我需要文件系统中文件的当前位置(可能已重命名或移动)。

我仍然找不到任何简单的方法来实现这一目标。有没有,或者我应该重新考虑我跟踪合成文件的方式吗?

1 个答案:

答案 0 :(得分:1)

要根据对象哈希获取历史记录,您可以使用此bash脚本:
传递哈希作为命令行arg,你将获得提交sha。

#!/bin/sh

blob=$1

git rev-list --all |
while read commit; do
    if git ls-tree -r $commit | grep -q $blob; then
        echo $commit
    fi
done

当你有提交sha时,你可以运行

git log [sha] --name-only

这将给你文件名。最后:

git log --follow - [filename]

这仅在当前版本文件路径与快照时的路径相同时才有效。但是会显示所有历史文件更改(假设使用了git mv)

如果不是这种情况,仍然可以通过使用git ls-tree来遍历所有提交,并且如果到达树节点,则将其遍历到其文件叶节点。 但是,您将手动需要找出它们之间的问题 路径A)a / b / foo.txt 和 路径B)c / d / foo.txt

它是否与foo.txt相同或不同?

根据我的经验,最好有一个好的文件命名约定并存储提交sha而不是文件blob sha。 从提交到另一个方式来获取文件blob sha要容易得多。