Как получить список всех файлов и их SHA1 из удаленного репозитория Git? - PullRequest
2 голосов
/ 24 января 2011

Я пытаюсь выяснить, как получить список всех файлов и их SHA1 в удаленном репозитории Git.

Есть способ сделать это из локального репозитория, команда которого:

git ls-files * -s

Что возвращает следующее (в примере):

100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README

Но выгода заключается в том, что вам необходимо выполнить полное клонирование и забрать всю информацию заранее.Это не работает на голом клоне удаленного репозитория.

Любая подсказка?

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Итак, ответ следующий (что я выяснил):

В этих шагах предполагается, что для вашего git-репо настроен HTTP-доступ с помощью команды update-server-info, настроенной в качестве перехвата после получения (и, возможно, других вещей, поскольку я использую git-репо, настроенный github. ком). 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>
    

Примечание. Если нужный файл находится в подкаталоге корня репозитория, запись в объектном файле дерева будет иметь идентификатор типа объекта дерева (в данном случае это 040000). Вы можете взять SHA1 этого объекта дерева, HTTP получить его, затем распаковать его, просмотреть содержимое и повторять этот процесс, пока не перейдете к нужному файлу, а затем получить содержимое файла, используя его SHA1 (как в предыдущем шаг), и вот, пожалуйста.

0 голосов
/ 24 января 2011

Я не совсем уверен, что это то, что вы ищете ... но чтобы иметь возможность получить любую информацию об удаленном репозитории, вам нужно извлечь его.При извлечении из удаленного хранилища вся информация о его ветвях загружается в вашу локальную копию.Таким образом, вы можете легко проверить удаленную ветку (git checkout origin/master) и использовать команду ls-files.

...