如何从远程Git仓库获取所有文件及其SHA1的列表?

时间:2011-01-24 20:21:44

标签: git list file sha1

我正在试图弄清楚如何在远程Git存储库中获取所有文件及其SHA1的列表。

有一种方法可以从当地的仓库执行此操作,其命令是:

git ls-files * -s

返回以下内容(在一个示例中):

100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README

但这里的问题是你必须执行一个完整的克隆并提前提取所有信息。这不适用于远程存储库的裸克隆。

有任何线索吗?

2 个答案:

答案 0 :(得分:2)

所以答案如下(我已经想到了):

这些步骤假设您的git repo设置了HTTP访问,并且update-server-info命令设置为post-receive钩子(可能还有其他东西,因为我正在使用github设置的git repo。 COM)。 HTTP也可以是HTTPS。

  • HTTP GET / info / refs

    此文件包含以下内容:

    4462ced0a4be2135c009ba6224c2191c7a3f844a    refs/heads/master
    
  • HTTP GET / objects / 44 / 62ed0a4be2135c009ba6224c2191c7a3f844a

  • 使用zlib解压缩此文件。

    此文件将包含以下内容:

        commit 219
        tree 0d4f34f97d76e54666751a850e9300e8b23c1adb
        parent fca1c898e2b4a43c66f211bd3547dc301511721d
        author yourname <yourname@email.com> 1295905469 -0800
        committer yourname <yourname@email.com> 1295905469 -0800
    
        added a/a.txt.
    
  • 将树SHA1放在顶部。

  • HTTP GET / objects / 0d / 4f34f97d76e54666751a850e9300e8b23c1adb

  • 使用zlib解压缩此文件。

    此文件将包含以下内容:

        Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
        00000000  74 72 65 65 20 39 35 00 31 30 30 36 34 34 20 32  tree 95.100644 2
        00000010  2E 74 78 74 00 1F D1 48 91 80 32 74 3B 3B 79 DB  .txt..ÑH‘€2t;;yÛ
        00000020  57 3C 63 A5 D4 53 08 98 08 31 30 30 36 34 34 20  W<c¥ÔS.˜.100644 
        00000030  52 45 41 44 4D 45 00 FF 80 47 81 C4 74 A0 6B D0  README.ÿ€G.Ät kÐ
        00000040  55 99 5E 48 C3 07 99 BC 6A B6 5A 34 30 30 30 30  U™^HÃ.™¼j¶Z40000
        00000050  20 61 00 1A 60 2D 9B D0 7C E5 27 2D DA A6 4E 21   a..`-›Ð|å'-Ú¦N!
        00000060  DA 12 DB CA 2B 8C 9F                             Ú.ÛÊ+ŒŸ
    

    此文件的格式如下:

        tree<space>##<NULL><object type id><space><filename><NULL><SHA1>
    

    这种模式不断重复。

  • 从此示例中获取第一个SHA1(1fd148918032743b3b79db573c63a5d453089808)。

  • HTTP GET / objects / 1f / d148918032743b3b79db573c63a5d453089808

  • 使用zlib解压缩此文件。

    此文件将包含以下内容:

        Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    
        00000000  62 6C 6F 62 20 36 00 61 64 73 66 0A 32           blob 6.adsf.2
    

    在那里你有一个单独文件的内容(你跟踪过的路径,以及你之前从树名单中知道的名字)。此文件的前缀是一些元信息,在本例中为:

    blob 6<NULL><file content>
    

注意:如果所需的文件位于repo根目录的子目录中,则树对象文件中的条目将具有树的对象类型id(在本例中显示为040000)。您可以获取该树对象的SHA1,HTTP GET该对象,然后解压缩,查看内容,并重复该过程,直到您深入查看所需的文件,然后使用它的SHA1获取文件内容(如同最后一样)步骤),然后你去。

答案 1 :(得分:0)

我不完全确定这是否是您正在寻找的...但是为了能够获得有关远程存储库的任何信息,您需要从中获取它。从远程存储库获取时,有关其分支的所有信息都将下载到本地副本。因此,您可以轻松签出远程分支(git checkout origin/master)并使用ls-files命令。