【问题标题】:Where can I find snapshot for a specific Git commit?在哪里可以找到特定 Git 提交的快照?
【发布时间】:2020-01-31 08:55:43
【问题描述】:

我了解到:

  • Git 为每次提交保留一个快照
  • 快照本质上是copieschanged 文件和一些referencesunchanged 文件
  • 所有 Git 相关数据都存储在存储库目录内的.git 目录下。
duong2179-mbpro:.git duong2179$ ls -l
total 480
-rw-r--r--    1 duong2179  admin     742 Oct  2 13:03 COMMIT_EDITMSG
-rw-r--r--    1 duong2179  admin   15646 Oct  2 13:28 FETCH_HEAD
-rw-r--r--    1 duong2179  admin      33 Oct  2 13:28 HEAD
-rw-r--r--    1 duong2179  admin      41 Oct  2 13:28 ORIG_HEAD
-rw-r--r--    1 duong2179  admin     849 Oct  2 13:07 config
-rw-r--r--    1 duong2179  admin      73 Apr 24 16:18 description
drwxr-xr-x   17 duong2179  admin     578 Apr 24 16:19 hooks
-rw-r--r--    1 duong2179  admin  185528 Oct  2 13:29 index
drwxr-xr-x    3 duong2179  admin     102 Apr 24 16:18 info
drwxr-xr-x    4 duong2179  admin     136 Apr 24 16:19 lfs
drwxr-xr-x    4 duong2179  admin     136 Apr 24 16:19 logs
drwxr-xr-x  260 duong2179  admin    8840 Aug 19 15:50 objects
-rw-r--r--    1 duong2179  admin   19239 Apr 24 16:19 packed-refs
drwxr-xr-x    5 duong2179  admin     170 Sep 25 16:05 refs
drwxr-xr-x    3 duong2179  admin     102 Aug  5 15:03 subtree-cache

给定一个 Git 提交哈希,我在哪里可以找到 .git 子目录中的关联快照?

【问题讨论】:

    标签: git version-control git-commit


    【解决方案1】:

    如果该提交被打包(delta compressed),您将不会直接找到它:请参阅“Git Internals - Packfiles

    您需要验证每个包并查看您的提交 SHA1 是否存在:

    $ git verify-pack -v .git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.idx
    2431da676938450a4d72e260db3bf7b0f587bbc1 commit 223 155 12
    69bcdaff5328278ab1c0812ce0e07fa7d26a96d7 commit 214 152 167
    

    然后您需要unpack that pack file

    如果未打包,请参阅“Git Internals - Git Objects

    $ find .git/objects -type f
    .git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2
    .git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # commit 3
    

    例如,提交 3 的 SHA1 为 1a410efbd13591db07496601ebc7a059dd55cfe9,其数据位于:

    1a/410efbd13591db07496601ebc7a059dd55cfe9 
    

    然后您可以通过以下方式读取该提交元数据的内容:

    # Windows:
    perl -MCompress::Zlib -e "undef $/; print uncompress(<>)" < 410efbd13591db07496601ebc7a059dd55cfe9 
    
    # Linux
    
    perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)' < 410efbd13591db07496601ebc7a059dd55cfe9 
    

    你会得到:

    commit 349 tree 410efbd13591db07496601ebc7a059dd55cfe9 
    parent 53316403bc0e36f650796d0afdc0687c52357694
    author VonC <VonC@email.com> 1569944592 +0200
    committer VonC <VonC@email.com> 1569944592 +0200
    
    This is a commit comment message
    

    【讨论】:

    • 你的意思是快照是somehow(打包/不打包)存储在.git/objects下的吗?
    • @duong_dajgja 是的,他们是。
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2018-07-04
    • 1970-01-01
    相关资源
    最近更新 更多