web-dev-qa-db-ja.com

gitリポジトリでファイルの古いバージョンのコピーを取得する方法は?

いくつかのコミットの.texファイルのバージョンがあり、そのコピーを取得したいと思っています。目的のファイルのバージョンを持つコミットのsha1ハッシュ値があります。ファイルの現在のバージョンを置き換えたくありません。むしろ、古いバージョンでの状態を反映する別個のコピーを取得したいだけです。

多くの同様の質問がgit checkout <sha1> -- file.texを使用することを示唆していますが、これは単に「error:pathspec 'file.tex'がgitに知られているどのファイルとも一致しませんでした」を与え続けます。

私が興味を持っているファイルは、もともとリポジトリの最上位ディレクトリに存在していました。現在、このコマンドを実行してリポジトリのサブディレクトリに移動し、サブディレクトリで古いバージョンのfile.texを取得しようとしています。

これは可能ですか?これどうやってするの?

39
jbranchaud

git cat-fileを使用して、ファイルの内容を標準出力にダンプし、それを目的の宛先にリダイレクトできます。

git cat-file -p <sha1>:./file.tex > wherever.tex

./は、リポジトリのサブディレクトリにいる場合に必要です。リポジトリのトップレベルにいる場合は、省略できます。また、古いバージョンのgitでは機能しない場合があります。この場合、リポジトリのルートに相対するファイルへの絶対パスを明示的に指定する必要があります。

64
qqx

最善の解決策は、ファイルを一時的に上書きすることだと思います。リポジトリの最上位で:

git checkout <sha1> file.tex
cp file.tex directory
git checkout file.tex

_git show_を絶対リポジトリパスで使用:

workdir $ git show revision:repo/module/package/code.file> code.file.old

または現在のディレクトリからの相対パス:

package $ git show revision:./ code.file> workdir/code.file.old

ファイルをチェックアウトするのとは対照的に、showはワークスペースを本質的に変更するものではなく、出力で好きなことを行うことができます。

この回答 に感謝し、もちろん manual で詳細を参照してください。

1
gws