我正在试图弄清楚如何在远程Git存储库中获取所有文件及其SHA1的列表。
有一种方法可以从当地的仓库执行此操作,其命令是:
git ls-files * -s
返回以下内容(在一个示例中):
100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README
但这里的问题是你必须执行一个完整的克隆并提前提取所有信息。这不适用于远程存储库的裸克隆。
有任何线索吗?
答案 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
命令。