2016-11-21 9 views
1

現在、JGitを使用してJavaプロジェクトを作成しています。私はまだJGitを使用していませんでしたが、私はその機能が通常のgitと同じように静かであると仮定しています。gitリポジトリからのバイナリ以外のファイルのリスト表示またはアーカイブ

私がやろうとしているのは、すべてのバイナリ以外のファイルと、裸のgit repoブランチから特定のサイズ以下のファイルを取得し、zipファイルにアーカイブすることです。この作業は作業ディレクトリを持つリポジトリでは簡単ですが、単純にgit grep -Ic ''を使用してすべての非バイナリファイルを一覧表示し、それらのファイルをgit archiveに渡すことができるので、これは裸のリポジトリでは実行できません。

ご協力いただきありがとうございます。

答えて

3

JGitのArchiveCommandを使用してアーカイブを作成できます。そのsetPaths()メソッドを使用すると、含まれる特定のパスのみを選択できます。

パスのリストをアセンブルするには、アーカイブするコミットのツリーを分析したいと思うでしょう。例えば:

TreeWalk treeWalk = new TreeWalk(repository); 
treeWalk.setRecursive(true); 
treeWalk.addTree(commit.getTree()); 
while(treeWalk .next()) { 
    if(!isBinary(treeWalk) { 
    filesToArchive.add(treeWalk.getPathString()); 
    } 
} 
treeWalk.close(); 

コード例をアーカイブするコミットのツリー全体を歩き、ツリー内の各ファイルの内容を取得し、そのコンテンツがテキストまたはバイナリであるかどうかを決定するために架空isBinary()メソッドを呼び出します。すべての非バイナリファイルは、ArchiveCommandに渡すことができるfilesToArchiveコレクションに追加されます。あなたはJGitの属性サポートを使用して成功することがありisBinary()実装については

Attributes attributes = new AttributesHandler(treeWalk).getAttributes(); 
boolean binary = attributes.isSet("binary"); 

AttributesHandler::getAttributes()treeWalkによって表される現在のパスの属性を合併返します。

ObjectId blobId = getObjectId(0); 
ObjectReader objectReader = repository.newObjectReader(); 
ObjectLoader objectLoader = objectReader.open(blobId); 
byte[] bytes = objectLoader.getBytes(); 
objectReader.close(); 
booloean binary = RawText.isBinary(bytes); 

RawText::isBinaryが所与のコンテンツはバイナリまたはテキストであるかどうかを決定するためにネイティブのGitと同じヒューリスティックを使用する:

あるいは、そうのようなisBinary()方法を実装するためにRawText::isBinary()を使用してもよいです。

+0

これは素晴らしいことです。ファイルがバイナリかプレーンテキストかを判断するだけです。ありがとう。 –

+1

回答を編集してください。 –

+0

ありがとう@Rüdigerもう一度。プライベートだから 'AttributesHandler.BINARY_RULE_KEY'をどう使うのか分かりませんが、私はここから管理することができると思います –

0

このコマンドの名前はgit archiveであり、作業用のツリーを気にするよりもずっとうれしいです。

export-ignore attribute、repo-local .git/info/attributes(または裸のレポのように、ただinfo/attributes)の不要なファイルは、ここで手軽に除外できます。また、git ls-files|git check-attr --stdin --allは、何でタグ付けされたものか、または任意のコミット(git ls-tree -r --name-only your.ref.here|git check-attr -a --stdin)でタグ付けされたものを見つけるための便利なスターターキットです。

属性ファイルに任意のパターンを入れることができます。

+0

ありがとうございました。しかし、私はここにいくつかの問題があります。まず最初に、JGitはgit属性を完全にサポートしていませんが、理解している限り、export-ignoreはファイルタイプ(基本的にバイナリファイルと非常に大きなファイル)ではなくファイルとディレクトリを指定します。大きなファイルについての部分を今質問に追加しました。第二に、 'git ls-files'は裸のreposで動作しません(' git ls-tree'は行いますが) –

+0

もう一つのことです。 'git check-attr'は本当に素晴らしいですが、わかっている限り、属性ファイルごとに属性を返します。私の側からのファイルがなければ、gitはテキストファイルとバイナリファイルを区別できるはずです。私はちょうどgitからこの情報を取得する方法を知らない、JGit –

+1

_Humans_は、 "バイナリ"と何がないかを伝えるのは難しいことがあります。それは特徴付けなので、少し恣意的です。予期しないエンコーディングのテキストはバイナリに見えることがありますGitは試してみるか、 'find -type f | xargs -d \\ nファイル| grep -v:。* text'を実行すると、 "ファイル"コマンドのテキストのように見えないものがすべてスターターキットとして検索されます。 – jthill

関連する問題