2016-12-01 10 views
0

リポジトリ履歴のある時点でいくつかのブロブにアクセスしたいと思います。Git:.gitディレクトリのblobパスを取得する

現在、私はgit show $REV:$PATHでそれを行います。しかし、ファイルはかなり大きく、私はそれらを読み上げてスクリプトでパイプしたくない。私は彼らのパスを取得し、プレーンなファイルとして読んでみたい。

現在のドキュメントに記載されているレイアウト(例:.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0)に依存して、ファイルハッシュを取得し、手動でパスに変換できますか?私は将来のバージョンですぐに変更されないことを意味し、オブジェクトディレクトリは常にこの構造を持っています。 いくつかの配管コマンドで簡単に行う方法はありますか?

+1

[packed repositories](https://git-scm.com/docs/git-repack)(例: 'git repack -ad'を実行した後)?パックされたリポジトリでは、ブロブはスタンドアロンファイルとして存在しないことがあります。 – Leon

+1

.git/objects内のファイルは元のデータではありません。それらは圧縮されており、小さなヘッダーがあります。ファイルに直接アクセスすることで何も得られません。 – j6t

+0

@ Leon @ j6t言い換えれば、私が望むのは単なる夢であり、 '.git'ディレクトリに直接アクセスすることはまだ悪い考えですか?私はブロブがいつも触れられていないと思った... –

答えて

1

inviolablesacrosanctあるBLOBデータが、それはただの人間に使用不可能な形式でもあります:j6t said in a commentとして

  • 、それはZLIB-しぼんだ(これは実装の詳細ではなく、約束ですつまり、あなたはそれを開いて読むだけではなく、zlibインフレータを使ってそれを復元することになっています。あなたがGitにそれをさせることになっています)。

  • Leon said in a commentとして、それが開いて、最初の場所で読むために何アンパックオブジェクトファイルが存在しない、その場合には、を詰めている可能性があります。その代わりに、正しいパックファイルを見つけるためにパックインデックスファイルを開いてから、正しいパックファイルを開き(オブジェクトとそのベースを見つけ出すディレクトリでパックデータを見つけるために)、そしてxdeltaスタイルを元に戻す必要があります。しかし、not actually xdelta、それらのアイテムの圧縮。

あなたは配管のコマンドでファイルを読みたい場合は、あなたが最初のハッシュ見つけることができる:

$ git rev-parse HEAD~20:Makefile 
bdb55792f11a9f9565c4aad147a492caed7f09c3 

をして、その型を取得するには、生のオブジェクト、またはgit cat-file -tを抽出するためにgit cat-file -pを使用(またはオブジェクトなどの情報を読むには--batch-check)。あなたが実際には全く同じように自分自身git cat-fileに直接パスを渡すことができることに注意してください:

$ git cat-file -t HEAD~20:Makefile 
blob 

ただし、1つのより多くの潜在的なつまずき:git cat-file -p <blob-specifier>git show <blob-specifier>のいずれかでブロブの内容にアクセスするとき、あなたが得ますリポジトリ形式のデータ。つまり、特定のコミット(git checkout)をチェックアウトすると、Gitは.gitattributesファイルを抽出したり、git config設定を使用して、作成する汚れフィルタやCR-LF調整を探します。これらのフィルタは、リポジトリ内のデータに適用され、ファイルの作業ツリーコピーを生成します。しかし、git showまたはgit cat-file -pを使用してリポジトリデータにアクセスすると、フィルタは使用されません。

+0

そのような詳細な答えをありがとう。はい、私は配管コマンドでそれを行うことが可能であることを知っていますが、ポイントはファイルそのものを取得することでした...このアイデアは実装できず、 'git show'の出力を使用するようになりました。また、gitが改行記号に触れないことを明示的に指摘しておきました。 –

関連する問題