2017-03-28 4 views
0

ascii/textのあるgitブランチ内のすべてのファイルを、の裸の gitリポジトリから探して、その合計サイズを追加したいとします。gitオブジェクトのファイルタイプ(ascii、バイナリなど)をテストするにはどうしたらいいですか?

これは裸のレポであるため、作業ツリーがなく、単にブランチをチェックアウトしてファイルを直接テストするという解決策は機能しません。これらのリポジトリの数は数百GBに達し、このタスクの目的では読み取り専用です。つまり、作業ツリーの作成はオプションではなく、リポジトリのサイズはそれぞれのコピーを作成し、コピー内に作業ツリーを作成することは実用的ではありません。

私はそうのような裸のgitリポジトリ内の特定のブランチに属するすべてのオブジェクトを一覧表示することができます:

git ls-tree -r master --long 

これは私のオブジェクトのハッシュ与える:私が欲しい上記の例で

100644 blob 486a23256c437b811b5647e40517a35964f60dc6  42 file1.txt 
100644 blob f7b528c3a1412c12213e56394b679397bd4ecaa7  131 file2.xml 
100644 blob 773c90bbb7ab5552d47ce2fb153fc9d18ed0d386 5617 file3.jpg 
100644 blob 420cb792e80a97c89db9c9d7339b4fb9a680aa43 13130 file3.zip 

を最初の2つの平文オブジェクトしか取得できませんが、ファイルタイプのオブジェクト自体をテストする方法はわかりません。

+0

レポが裸でない場合、これは 'git ls-files --eol'です。 –

+2

@JoshLee:これは裸のリポジトリ(インデックスを持っています!)で... 'git read-tree 'そして 'git ls-files --eol'を実行します。注意:インデックスを使ってデプロイメントを追跡している場合(例えば、受信後のフックで 'git --work-tree = ... checkout')、このために一時インデックスを使いたいかもしれません。 – torek

+0

@torek私が正しく理解していれば、 'git read-tree 'は一時的な/キャッシュされたインデックスを作成しますか?私はこれがどこに保存されているか書き込まれているかを調べようとしています。 'git read-tree -empty'でクリアできるようですが、その情報が最初の場所に格納されている場所が不思議です。 – daveruinseverything

答えて

2

Git自体はテキストファイルとバイナリファイルを区別しません。フロントエンドの磁器ツールの多くは機能しますが、内部的には違いはありません。どのツールを使うのが最も良い方法は、gitベースでないツールfileを使うことです。コンテンツをfileに送信するには、git showを使用できます。たとえば、git show 486a23256c437b811b5647e40517a35964f60dc6 | file -を実行した場合、/dev/stdin: ASCII textが返されます。 git show f7b528c3a1412c12213e56394b679397bd4ecaa7 | file -を実行した場合、/dev/stdin: XML 1.0 document textが表示されることがあります。

一般に、fileは、プレーンテキストのように見えるものには、出力のどこかに単語textがあり、テキストのようには見えません。具体的には、fileためmanページは言う:

印刷タイプは通常の単語のテキストのいずれかが含まれます(ファイルは、印刷文字といくつかの一般的な制御文字が含まれており、ASCII端末で読み取るために、おそらく安全です)、実行可能(ファイルには、ある種のUNIXカーネルや他のものが理解できる形式でプログラムをコンパイルした結果が含まれています)、または何か他の意味を持つデータ(データは通常バイナリまたは印刷不可能です)。例外は、バイナリデータを含むことが知られているよく知られているファイル形式(コアファイル、tarアーカイブ)です。だから、

出力にtextを探し、その後file通じgit showの出力あなたのパイプならば、そして、あなたはそれがテキストまたはバイナリかどうかを決定することができるはずです。

+1

'file'はGitの推測と一致しないかもしれないと思っているのですが、' .gitattributes'を使ってGitの磁器のビットにファイル名やグロブパターンが特にテキストかバイナリかを伝えることは、どちらか。 Gitがファイルのタイプ( 'gpath cat-file -p'の' --path'と '--textconv')について、Gitが推測していることを調べる配管コマンドを持っていればいいかもしれません。 – torek

+0

そのようなことがあれば私はそれについて知らないが、私はそこにいることを望む。 –

+2

Josh Leeのコメントと私の返答を見てください。 'git ls-files --stage'が役に立つかもしれません。裸のリポジトリを使って、目的の木をインデックスに読み込む必要があります(または、主な索引を邪魔しないようにするには一時的なインデックスに)。 – torek

関連する問題