git 当文件在存储库中完全匹配时,获取所有提交哈希

uemypmqf  于 2023-09-29  发布在  Git
关注(0)|答案(2)|浏览(132)

我有一个git仓库,里面有大约1000个提交,我有一个JSON文件,我知道这个文件在仓库中的路径。
这是我的裸文件,我们称之为person.json

{
  "name": "Thomas",
  "age": 30
}

我知道在git历史中的某个时候,这个文件存在于git仓库中。它的相对路径是./people/person.json,永远不会改变。
鉴于这三件事:

  • REPO_URL
  • 本地person.json文件
  • 路径./people/person.json

我的目标是输出所有的提交哈希,其中文件person.json在repo中准确地出现/匹配。
显而易见的手动解决方案是在repo中循环所有提交,并在我拥有的文件和文件应该在哪里之间进行校验和匹配。这是可能的,但对于许多文件来说需要很长时间。
有没有一些git原生的方法可以做到这一点?

oxf4rvwz

oxf4rvwz1#

这是一个简单的本地操作,在一个像样的盒子上(不确定Windows),在你的回购上只需要很短的时间。所以,获取文件的哈希值....就像这样:

git ls-tree -r HEAD | grep the-file

在我的情况下:

$ git ls-tree -r HEAD | grep pom.xml
100755 blob some-hash-id    pom.xml

你取一些-hash-id,然后这样做:

git log --all --pretty=%h | while read revision; do 
    lines=$( git ls-tree -r $revision | grep some-hash-id | wc -l )
    if [ $lines -gt 0 ]; then
        echo The file is present in $revision
        git ls-tree -r $revision | grep some-hash-id
        echo
    fi
done

就是这样

t8e9dugd

t8e9dugd2#

我知道你要求原生的git解决方案,但我来到这里寻找任何答案,发现跟踪文件更改的日志并进行外部校验和更快,但这是较小的文件,更改频率较低:

cs=$( sha1sum path/file | cut -d' ' -f 1 )
 git log --format="%H" --follow -- path/file | while read a; do
     echo -n "$a "; git --no-pager show $a:path/file | sha1sum
 done | grep -B 1 $cs

其中,git log sha1..sha1是查看结果的一种方式。

相关问题