私がやりたいのは、このような一般的な名前部分を持つ単一のファイルまたはファイルのセットをチェックアウトすることです
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
diff
やadd
のようなgitコマンドには、限られたワイルドカード機能がありますが、checkout
には何も見つかりませんでした。方法はありますか?
編集:Linuxでgit 1.7.9.5を使用しています。 gitコマンドとShellコマンドの有効な組み合わせも受け入れられます。
Gitdoesは fnmatch(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>
_
Gitはワイルドカードを処理しませんが、シェルは処理します。
これを試して :
git checkout myBranch **/myFile.md
そして
git checkout myBranch **/*Test*
とともに **
、シェルは現在の作業ディレクトリから始まるすべてのサブディレクトリでファイルを探します。
Powershell
@(gci -Recurse *test* | Resolve-Path -Relative) | %{git checkout mybranch -- $_)
gciは、基準に一致するすべてのファイルのリストを生成します(*test*
)次に、Resolve-Pathにパイプして相対パスを取得します。最後に、ファイル名のフラット化された(@)リストがgit呼び出しにパイプされます(見つかったファイルごとに1回実行されます)。
他の答えはどれもうまくいきませんでしたが、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;
}