2011-01-24 45 views
1

我想弄清楚如何在遠程Git存儲庫中獲取所有文件及其SHA1的列表。如何從遠程Git倉庫獲取所有文件及其SHA1的列表?

有一種方法可以從本地回購誰的命令做到這一點:

git ls-files * -s 

它返回以下(以爲例):

100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt 
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README 

但這裏的前提條件是,你必須執行完整的克隆並提前提取所有信息。這不適用於遠程存儲庫的裸露克隆。

任何線索?

回答

2

所以答案是以下(即我已經想通了):

這些步驟假定您的混帳回購協議設置與設置爲一個更新server-info命令HTTP訪問後收到鉤子(可能還有其他的東西,因爲我使用github.com設置的git repo)。 HTTP也可以是HTTPS。

  • HTTP GET /信息/裁判

    此文件將包含類似:

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

  • 使用解壓縮這個文件zlib的。

    此文件將包含類似:

    commit 219 
        tree 0d4f34f97d76e54666751a850e9300e8b23c1adb 
        parent fca1c898e2b4a43c66f211bd3547dc301511721d 
        author yourname <[email protected]> 1295905469 -0800 
        committer yourname <[email protected]> 1295905469 -0800 
    
        added a/a.txt. 
    
  • 以樹SHA1頂部。

  • HTTP GET /反對/ 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 /反對/ 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> 
    

注意:如果你想要的文件在回購的根目錄的子目錄,在樹對象入門文件將具有樹的對象類型ID(在這種情況下顯示爲040000)。您可以獲取該樹對象的SHA1,HTTP獲取該對象,然後解壓縮該對象,查看內容並重復該過程,直到深入查看所需的文件,然後使用它的SHA1獲取文件內容(就像上次一樣一步),然後你去。

0

我不完全確定這是否是您要查找的內容..但爲了能夠獲取有關遠程存儲庫的任何信息,您需要從中獲取信息。從遠程存儲庫獲取時,有關其分支的所有信息都會下載到您的本地副本。因此,您可以輕鬆檢出遠程分支(git checkout origin/master)並使用ls-files命令。

+0

是的,我正在尋找沒有克隆或提取執行此操作。 – Bob 2011-01-24 21:06:23

+0

這是不可能的。這不是DVCS的工作原理。您無法在遠程服務器上執行任何操作;那麼您需要在該特定服務器上本地執行此操作。 – poke 2011-01-24 21:10:41