Git:別のブランチからディレクトリ内のすべてのファイルをコピーします


188

ディレクトリ内のすべてのファイルを別のブランチからコピーするにはどうすればよいですか?そのディレクトリ内のすべてのファイルをリストすることができます

git ls-tree master:dirname

次に、次のようにしてすべてのファイルを個別にコピーできます

git checkout master -- dirname/filename

ただし、これまでのところワイルドカードの使用は完全に失敗しています。これは何もしません:

git checkout master -- dirname/*.png

私はbashスクリプトを使用してそれを行うことができると思いますが、もっと簡単な方法があるはずですよね?

回答:


288

ツリー内でファイルを移動するつもりはないので、ディレクトリをチェックアウトできるだけです。

git checkout master -- dirname

2
コピーされたファイルのコミットメッセージを保持したい場合はどうなりますか?
totels

2
@totels、厳密に言えば、ファイルに関連付けられたコミットメッセージはありません。コミットメッセージは、コミットオブジェクト自体に関連付けられています。これは私があなたが望んgit checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;でいる$COMMIT_SHA1ことです:どこにあるのか、branch_aそしてあなたが望むコミットメッセージを持つコミットオブジェクトになるでしょう。プログラムへのコミットをどのようにプログラムで決定するのか、最近の変更点を知らないdirname
Alexander Bird

1
これには非常に奇妙な副作用があります。コピーdirnameします.gitignoreが、masterブランチのにあるファイルもコピーします。それはなぜですか?
ミリメトリック2013

4
現在のブランチに、チェックアウトしているブランチ(特定のターゲットフォルダー内)にない追加のファイルがある場合、基本的にそれらがマージされます-これは祖先である場合にのみ可能性がありますか?条件は正確にはわかりませんが、ブランチAに20個のファイルとブランチBに20個のファイルがあり、そのうちの10個だけが同じファイル名を持つ場合、30個のファイルになります(少なくとも私の場合、ブランチAブランチBの祖先です)
codercake 2014年

@totelsはgitコマンドをチェックアウトしcherry-pickます。他のブランチからのコミットが適用されますが、必要なコミットで変更されたファイルのみが適用されます。
cs01 2015

18

パスにスペースがなく、私と同じように、特定の拡張子のファイルのみに興味がある場合は、

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
gitがこの関数を直接サポートしていないのは残念です。OPのように、私はそれが次のようなものになると思ったでしょうgit checkout master -- *.c
グレゴリー・クーン

1
この回答は、「特定のパターンのファイルを別のブランチから現在の作業ブランチにチェックアウトするにはどうすればよいですか?」
USR-ローカルΕΨΗΕΛΩΝ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.