【问题标题】:How do i get a list of all the files and their SHA1s from a remote Git repo?如何从远程 Git 存储库获取所有文件及其 SHA1 的列表?
【发布时间】:2011-01-24 20:21:44
【问题描述】:

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

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

git ls-files * -s

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

100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README

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

有什么线索吗?

【问题讨论】:

    标签: git list file sha1


    【解决方案1】:

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

    这些步骤假设你的 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 获取文件内容(就像在最后步骤),然后就可以了。

    【讨论】:

    • 我敢肯定,通过 git 获取比这个 HTTP 请求垃圾邮件更有效和更快......
    • 我正在使用的系统(不是机器,而是系统)实际上可能更慢。但是很高兴终于知道列出存储库的内容和从该存储库请求单个文件都是可能的(尽管其他人一直说这是不可能的)。
    【解决方案2】:

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

    【讨论】:

    • 是的,我正在寻找无需克隆或获取的情况下执行此操作。
    • 这是不可能的。这不是 DVCS 的工作方式。您不能在远程服务器上执行操作;然后,您需要在该特定服务器上本地执行此操作。
    猜你喜欢
    • 2011-06-13
    • 2011-04-08
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多