web-dev-qa-db-ja.com

Gitの特定のリビジョンから単一のファイルを取得する方法

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

私はgitkを使ってファイルを見ることができましたが、それを保存するオプションはありません。私はコマンドラインツールを試してみました。

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

ただし、このコマンドはファイルの内容ではなく差分を表示します。後でPAGER=catのようなものを使用して出力をファイルにリダイレクトできることはわかっていますが、実際のファイルの内容に到達する方法がわかりません。

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

736
Milan Babuškov

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

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

このコマンドは通常のリビジョンスタイルを取ります。つまり、次のいずれかを使用できます。

  1. ブランチ名( 推奨 / ash
  2. HEAD + x ^文字の数
  3. 与えられたリビジョンのSHA1ハッシュ
  4. 与えられたSHA1ハッシュの最初の数文字(おそらく5文字)

ヒント "git show"を使用するときは、 常にリポジトリのルートからのパスを指定してください で、現在のディレクトリ位置ではありません。

Mike Morearty は、少なくともgit 1.7.5.4では、パスの先頭に "./"を入れることで相対パスを指定できることに言及していますが、例えば:

git show HEAD^^:./test.py


Git1.5.x以前では、これはいくつかの配管で行われました。

git ls-tree <rev>
コミット内の1つ以上の「BLOB」オブジェクトのリストを表示します

git cat-file blob <file-SHA1>
特定のリビジョン内でコミットされたファイルをcatします(svn catと同様)。 git ls-treeを使って与えられたfile-sha1の値を取得する

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

git-ls-treeはリビジョン$ REVで$ fileのオブジェクトIDを一覧表示します。これは出力から切り出され、git-cat-fileの引数として使われます。これは実際にはgit-cat-objectと呼ばれるべきです。そのオブジェクトは標準出力になります。


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

commit 3214594commit 7bcf341 (2016年9月9日)、 commit 7bcf341 (09 Sep 2016)、および commit b9e62f6commit 16dcc29 (24 Aug 2016) ヨハネスシンデリン(dscho
Junio C Hamano - gitster - in commit 7889ed2 、2016年9月21日にマージ)

cat-file:バッチモードで--textconv/--filtersをサポート

git hash-objects 」はファイルシステム上のデータストリームを取得し、それをGitオブジェクトストアに入れるためのツールですが、「外部からGitへの」変換を実行することはできます(例:end-of)クリーンなフィルタのオンライン変換と適用)、そしてそれは非常に初期の頃からデフォルトで機能を持っていました、その逆の操作 " git cat-file "、それはGitオブジェクトストアからオブジェクトを取り、消費のために外部化外の世界では、「Git-to-outside-world」を実行するための同等のメカニズムが欠けていました。

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

注: "git cat-file --textconv"は最近Sefafaulting(2017)を開始しました。これはGit 2.15(2017年第4四半期)で修正されました。

コミットcc0ea7c (2017年9月21日)/ Jeff King(peff を参照。
Junio C Hamano - gitster - in commit bfbc2fc 、2017年9月28日にマージ)

651
VonC

現在のブランチのファイルの内容を前回のコミットまたは別のブランチのファイルの内容で置換/上書きしたい場合は、次のコマンドを使用して実行できます。

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

または

git checkout mybranchname path/to/file.txt

その後、それらが現在のブランチで有効になるように、それらの変更をコミットする必要があります。

463
c-a

ファイルへのフルパスを入力する必要があります。

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
136
Milan Babuškov

最も簡単なの方法は次のように書くことです。

git show HASH:file/path/name.ext > some_new_name.ext

ここで、

  • HASHはGitリビジョンSHA-1のハッシュ番号です
  • file/path/name.extは探しているファイルの名前です
  • some_new_name.extは、古いファイルを保存する場所のパスと名前です。

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

これは、リビジョン27cf8emy_file.txtmy_file.txt.OLDという名前の新しいファイルとして保存します。

Git 2.4.5でテストされました。

あなたが削除された検索ファイルを使いたいのなら、HASH~1を使うことができます(指定されたHASHの前に1コミット)。

例:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt
76
jmarceli

Windowsでは、Git Bashを使って:

  • ワークスペースで、dirをファイルが存在するフォルダに変更します。
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
10

そしてそれをファイルにうまくダンプするために(少なくともWindows上で) - Git Bash:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.Java`" >> LM_60d8bdfc.Java

改行を保持するために"の引用符が必要です。

6
Mr_and_Mrs_D

これは、パスを指定せずにコミット間にすべての削除済みファイルを取得するのに役立ちます。削除済みファイルが多数ある場合に役立ちます。

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
3
Adrian Gunawan