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

如何从远程Git repo获取所有文件及其SHA1的列表?,git,list,file,sha1,Git,List,File,Sha1,我试图弄清楚如何在远程Git存储库中获得所有文件及其SHA1的列表 有一种方法可以通过本地回购来实现,其命令是: git ls-files * -s 返回以下内容(在示例中): 但这里的问题是,您必须执行完整克隆,并提前下载所有信息。这在远程存储库的裸克隆上不起作用 有什么线索吗?我不太确定这是否就是你要找的。。但是,为了能够获得有关远程存储库的任何信息,您需要从中获取。从远程存储库获取时,有关其分支的所有信息都将下载到本地副本。因此,您可以轻松地签出远程分支(git checkout ori

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

有一种方法可以通过本地回购来实现,其命令是:

git ls-files * -s
返回以下内容(在示例中):

但这里的问题是,您必须执行完整克隆,并提前下载所有信息。这在远程存储库的裸克隆上不起作用


有什么线索吗?

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

因此答案如下(我已经找到):

这些步骤假设您的git repo是通过HTTP访问设置的,其中的更新服务器信息命令设置为post接收挂钩(可能还有其他内容,因为我使用的是github.com设置的git repo)。HTTP也可以是HTTPS

  • HTTP GET/info/refs

    此文件将包含以下内容:

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

  • 使用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.
    
        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                             Ú.ÛÊ+ŒŸ
    
    这里有一个单独文件的内容(您一直跟踪谁的路径,以及您从前面的树列表中知道谁的名字)。此文件以某些元信息作为前缀,在本例中为:

    blob 6<NULL><file content>
    
    blob6
    

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

是的,我希望在不克隆或获取的情况下执行此操作。这是不可能的。这不是DVC的工作方式。您无法在远程服务器上执行操作;那么你需要在特定的服务器上本地完成这项工作。我确信,通过git抓取要比这种HTTP请求垃圾邮件更高效、更快……对于我正在使用的系统(不是机器,而是系统),它实际上可能更慢。但很高兴终于知道,列出存储库的内容和从该存储库请求单个文件都是可能的(尽管其他人一直说这是不可能的)。
    tree<space>##<NULL><object type id><space><filename><NULL><SHA1>
    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>