2011-01-24 5 views
1

私はリモートのGitリポジトリにすべてのファイルとそのSHA1のリストを取得する方法を理解しようとしています。リモートGitリポジトリからすべてのファイルとそのSHA1のリストを取得するにはどうすればよいですか?

コマンドだ地元のレポからこれを行う方法があります:返す

git ls-files * -s 

(例では)次

100644 1fd148918032743b3b79db573c63a5d453089808 0 2.txt 
100644 ff804781c474a06bd055995e48c30799bc6ab65a 0 README 

をしかし、ここでキャッチはあなたということです完全なクローンを実行し、すべての情報を前もってプルダウンしなければなりません。これは、リモートリポジトリの裸のクローンでは機能しません。

ヒント?

答えて

2

だから、答えは(私は考え出したこと)以下の通りです:

これらの手順は、あなたのGitのレポがポスト受け取るよう設定アップデートサーバ-infoコマンドでHTTPアクセスを設定されていると仮定フック(とおそらく他のもの、私はgitub.comで設定されたgit repoを使用しています)。 HTTPはHTTPSでもかまいません。

  • HTTP GET /情報/レフリー

    このファイルには、のようなものが含まれます:使用してこのファイル

    4462ced0a4be2135c009ba6224c2191c7a3f844a refs/heads/master 
    
  • HTTP GET /オブジェクト/ 44/62ed0a4be2135c009ba6224c2191c7a3f844a

  • 解凍をzlib。上部にあるツリーSHA1を取る

    commit 219 
        tree 0d4f34f97d76e54666751a850e9300e8b23c1adb 
        parent fca1c898e2b4a43c66f211bd3547dc301511721d 
        author yourname <[email protected]> 1295905469 -0800 
        committer yourname <[email protected]> 1295905469 -0800 
    
        added a/a.txt. 
    
  • このファイルには、のようなものが含まれます。

  • 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経由でフェッチすることは、このHTTPリクエストよりもはるかに効率的で高速です... – poke

+0

実際には私が使用しているシステム(マシンではなくシステム)が遅いです。しかし、最終的にリポジトリの内容を一覧表示し、そのリポジトリから個々のファイルを要求することが可能であることを知ってうれしく思います。 – Bob

0

これはあなたが探しているものであるかどうかは完全にはわかりませんが、リモートリポジトリに関する情報を取得できるようにするには、そのリポジトリから取得する必要があります。リモートリポジトリからフェッチすると、ブランチに関するすべての情報がローカルコピーにダウンロードされます。したがって、リモートブランチ(git checkout origin/master)を簡単にチェックアウトし、ls-filesコマンドを使用することができます。

+0

はい、私はクローニングやフェッチを行わずにこれを実行します。 – Bob

+0

これはできません。 DVCSの仕組みではありません。リモートサーバーでは実行できません。その特定のサーバーでローカルで行う必要があります。 – poke

関連する問題