2017-10-25 3 views
0

git-archiveを使用してリビジョン履歴を分析しています(https://stackoverflow.com/a/40811494/1168342参照)。tar処理なしのgit-archiveと同等のディスク

アプローチは機能しますが、私は多くのリビジョンのプロジェクトを最適化しようとしています。多くの処理はアーカイブを(tar経由で)無駄にし、別のディレクトリのファイルに戻します(tarからもう一度)。

targit cp $revision $dest/のようなものを使用せずにこれを行う方法をお探しです。/

  • は、私は、ファイルのコピーとgit reset $revision --hardアプローチを使用することができますが、私は、複数のレポのコピー(各スレッドに1つを作成しない限り、それは、分析ボイドの並列化をレンダリングする:ここでは私がこれまでに調査したものですプロセス)。

  • 低レベルの操作でこれを実現するJava project using JGit called Dorisがありますが、奇妙なファイル(たとえば、他のreposへのリンク)があると壊れます。 gitが進化するにつれて、特別なケースがたくさんあるので、私はできるだけ低レベルでこれをやりたいとは思わない。

  • 私はPython用のgit APIはありますが、そのarchive featureもtarを使用しています。上記と同じ理由で、私はこれをあまりにも低いレベルでコードしたくありませんでした。

答えて

3

用途:

mkdir <path> && 
GIT_INDEX_FILE=<path>/.git git --work-tree=<path> checkout <revision> -- . && 
rm <path>/.git 

git checkoutステップはので、これはうまく並列化するために、私たちは目標にインデックスファイルを指すことができ、インデックスを上書きします。安全であることが確かなファイル名が1つあります:.git

(これはまた、アクティブな作業ツリーと新しい抽出ツリーを記録回避git worktree addの軽量版のようなものです。)

編集サイドメモを追加するには(私は、OPはこのことを認識している期待将来の参照のために):git archiveは、この技術が適用されない特定の.gitattributesフィルタを適用することに注意してください。特に、git checkoutexport-ignoreexport-substディレクティブに従いません。

+0

worktreeと.gitインデックス名は、worktreeとrepoが同じファイルシステム上にある限り動作すると思います。迷惑メールの名前でローカルリポジトリにスクラッチインデックスを置くと、常に動作します。 – jthill

+0

@jthill:通常のファイルシステムでソースリポジトリを使用して、/ tmp(別のファイルシステム)をターゲットとしてテストしました。それは特定のOSの1つだけですが、他のOSと同じデバイス間リンクにも同じ制限があります。 – torek

+0

Hunh。私はなぜ '-index-output'を読んでもGIT_INDEX_FILEではなく、おそらくそのドキュメントの古くなっている読書木には制限があるのだろうかと疑問です。"コマンドが動作している間に元のインデックスファイルがロックされています 通常のインデックスファイルの隣に作成された というテンポラリファイルから、 の名前を変更(2)する必要があります。通常、この は、インデックスファイルと同じファイルシステム上にある必要があります。 ファイル自体 ディレクトリへの書き込み権限が必要な場合、インデックスファイルとインデックス出力ファイルは にあります。 – jthill

0

JGitのArchiveCommandは、git archiveの機能を実装しており、いくつかのアーカイブファイル形式をそのまま使用できます。ただし、ArchiveCommandはカスタムアーカイブ形式で拡張できます。

カスタムフォーマットではFormatインターフェイスを実装し、ArchiveCommand::registerFormatで登録する必要があります。対応するAPIは単一の出力ファイルを考慮して設計されているように見えますが、その内容をディレクトリに出力することは可能です。

関連する問題