web-dev-qa-db-ja.com

git checkoutでワイルドカードを使用する方法はありますか?

私がやりたいのは、このような一般的な名前部分を持つ単一のファイルまたはファイルのセットをチェックアウトすることです

git checkout myBranch */myFile.mdおよび

git checkout myBranch -- */*Test*(「-」の部分についてはわかりません)

の代わりに

git checkout myBranch src/main/Java/a/deep/package/structure/myFile.mdおよび

git checkout myBranch src/test/Java/a/deep/package/structure/TestOne.Java
git checkout myBranch src/test/Java/a/deep/package/structure/TestTwo.Java
git checkout myBranch src/test/Java/a/deep/package/structure/resources/TestData.sql

diffaddのようなgitコマンドには、限られたワイルドカード機能がありますが、checkoutには何も見つかりませんでした。方法はありますか?

編集:Linuxでgit 1.7.9.5を使用しています。 gitコマンドとShellコマンドの有効な組み合わせも受け入れられます。

51
kostja

Gitdoesfnmatch(3) を使用してワイルドカードを処理します。 Git用語集pathspecエントリを参照してください。

ただし、gitがワイルドカードを認識できるようにするには、ワイルドカードをエスケープする必要があります。エスケープしないと、Shellが最初にワイルドカードを展開します。通常、単一引用符の間にワイルドカードを使用します。

_git checkout myBranch -- '*/myFile.md'
_

ワイルドカードは、ディレクトリ全体を含めて名前全体に適用されます。

ドキュメントで見ることができるように、pathspecでは、pathspecの解釈方法を変更するmagic signatureも許可しています。たとえば、icaseを使用して大文字と小文字を区別しないパスを作成できます(':(icase)*readme*'と入力してすべてのreadmeを検索できます)。

Windowsで問題が発生した場合に備えて、ここで@bambamsのコメントを引用します。

これはWindowsの2.8.1.windows.1では機能せず、cmd.exeシェルからGitを利用しているため、グロビングは組み込まれていません。しかし、このような残念な状態にある場合は解決策があります。 _git diff --name-only_とxargsを組み合わせて、目標を達成します。

_git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
_
58
coredump

Gitはワイルドカードを処理しませんが、シェルは処理します。

これを試して :

git checkout myBranch **/myFile.md

そして

git checkout myBranch  **/*Test*

とともに **、シェルは現在の作業ディレクトリから始まるすべてのサブディレクトリでファイルを探します。

21
Intrepidd

Powershell

@(gci -Recurse *test* | Resolve-Path -Relative) | %{git checkout mybranch -- $_)

gciは、基準に一致するすべてのファイルのリストを生成します(*test*)次に、Resolve-Pathにパイプして相対パスを取得します。最後に、ファイル名のフラット化された(@)リストがgit呼び出しにパイプされます(見つかったファイルごとに1回実行されます)。

1
9Rune5

他の答えはどれもうまくいきませんでしたが、bambamsのコメントはうまくいきました。 2つの引数を受け入れるbash関数にしました。使用法:

gitcheckout myBranch '* file *'

gitcheckout()
{
    GIT_DIR=$(git rev-parse --git-dir 2>/dev/null); 
    pushd .;
    cd $GIT_DIR/../;
    git diff --name-only $1 -- $2 | xargs git checkout $1 --;
    popd;
}
0
Klik