1. ホーム
  2. git

[解決済み] Gitで特定のリビジョンから単一のファイルを取得する方法とは?

2022-03-18 08:33:36

質問

Git リポジトリを持っていて、あるファイルが数ヶ月前にどうなっていたかを見たいと思っています。その日のリビジョンを見つけました。 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 . 私は1つのファイルがどのように見えるかを見る必要があり、またそれを("new")ファイルとして保存する必要があります。

を使って、なんとかファイルを見ることができました。 gitk しかし、それを保存するオプションがありません。コマンドラインツールで試したところ、最も近いものができました。

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

しかし、このコマンドはdiffを表示し、ファイルの中身を表示しません。後で、次のようなものを使うことができるのは知っています。 PAGER=cat を作成し、出力をファイルにリダイレクトすることはできますが、実際のファイルの内容を取得する方法がわかりません。

基本的には、次のようなものを探しています。 svn cat .

解決方法は?

使用方法 git show

自分の答えを完成させるために、構文は確かに

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

このコマンドは通常のリビジョンのスタイルを取ります。つまり、以下のどれでも使うことができます。

  1. ブランチ名 提案された によって )
  2. HEAD + x個 ^ 文字
  3. 指定されたリビジョンのSHA1ハッシュ
  4. 与えられたSHA1ハッシュの最初の数文字(多分5文字程度

チップ を使うときに覚えておきたいのは、" git show "です。 常にリポジトリのルートからのパスを指定します。 現在のディレクトリの位置ではありません。

(ただし マイク・モリアーティ は、少なくとも git 1.7.5.4 では、" を置くことで相対パスを指定できることを述べています。 ./ パスの先頭に "を付けてください。例えば

git show HEAD^^:./test.py

)

使用方法 git restore

Git 2.23+ (2019年8月) では、さらに git restore を置き換えたものです。 という紛らわしい git checkout コマンド

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

この場合、作業ツリーには "ソース" ( -s ) コミットSHA1またはブランチ somebranch .
インデックスも復元する場合。

git restore -s <SHA1> -SW -- afile

( -SW の略です。 --staged --worktree )


で述べたように コメント によって スターウォーズウィー

<ブロッククオート

これは、内容をファイルにパイプすることができるので、コミットからファイルをすばやく比較したい場合に最適です。

例)こんなことができます。

git show 1234:path/to/file.txt > new.txt 
git show 1234~:path/to/file.txt > old.txt

で、それらを比較します。


低レベルのgit plumbingコマンドを使用する

git1.5.x以前は、いくつかの配管を使用してこれを行いました。

git ls-tree <rev>
コミット内の 1 つまたは複数の 'blob' オブジェクトのリストを表示します。

git cat-file blob <file-SHA1>
特定のリビジョンにコミットされたファイルを cat します(svn の cat)を使用します。 使用 git ls-tree を指定すると、指定したファイル-sha1 の値を取得することができます。

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

git-ls-tree のオブジェクト ID をリストアップします。 $file リビジョン $REV の引数として使用されます。 git-cat-file という名前であるべきですが、実際には git-cat-object にダンプし、そのオブジェクトを stdout .


注:Git 2.11(2016年第4四半期)以降、コンテンツフィルターを適用して git cat-file を出力します。

参照 コミット 3214594 , コミット 7bcf341 (2016年09月09日)をご参照ください。 コミット 7bcf341 (2016年09月09日)、および コミットb9e62f6 , コミット 16dcc29 (2016年8月24日)によるものです。 ヨハネス・シンデリン( dscho ) .
(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット7889ed2 , 2016年9月21日)

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

注:"です。 git cat-file --textconv "が最近(2017年)セグフォールトを起こすようになりましたが、Git 2.15(2017年第4四半期)で修正されました。

参照 コミット cc0ea7c (2017年9月21日)によるものです。 ジェフ・キング ( peff ) .
(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミットbfbc2fc , 2017年9月28日)