74

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

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

のようないくつかのgitコマンドにはいくつかの制限されたワイルドカード機能があることを知っていますがdiffaddについては何も見つかりませんでしたcheckout。方法はありますか?

編集:私はLinuxでgit1.7.9.5を使用しています。gitコマンドとshellコマンドの有効な組み合わせも許容されます。

4

9 に答える 9

81

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

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

git checkout myBranch -- '*/myFile.md'

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

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

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

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

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
于 2015-10-23T15:24:47.360 に答える
23

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

これを試して :

git checkout myBranch **/myFile.md

git checkout myBranch  **/*Test*

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

于 2013-03-01T15:44:45.733 に答える
2

パワーシェル

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

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

于 2019-08-08T14:46:25.880 に答える
1

xargsを使用したWindowsgitbash

git difftool myBranch --name-only *.java | xargs git checkout myBranch
于 2020-03-23T05:48:14.547 に答える
0

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

gitcheckoutmyBranch'*ファイル*'

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;
}
于 2017-02-10T21:55:12.777 に答える
0

gitignoreまたは追跡されていないファイルがあり、git checkoutでワイルドカードを使用したい場合は、問題が発生する可能性があり、解決策は次のようになります。

git ls-files '*/myFile.md' | tr '\n' '\0' | xargs -0 -L1 -I '$' git checkout -- '$'
于 2020-04-20T13:51:33.383 に答える
0

gitが3番目の文字からブランチリスト名を返すことを知っているので、[マスク]で定義された必要なブランチに切り替えることができます。

BRANCH_NAME=$(git branch --list | grep [mask] | cut -c3-)
git checkout ${BRANCH_NAME}
于 2020-05-26T14:16:45.297 に答える
0

私にとってのタスクは、1つのパターンにちなんで名付けられた複数のファイルをチェックアウトすることでした。

  • ./a/b/c/FirstTest.java
  • .d/e/f/SecondTest.java
  • ./g/h/i/ThirdTest.java

私はこのbashコマンドを使用しました:

# 1. Find files named after "*Test.java" pattern.
# 2. Execute checkout command on every found file.

find . -name "*Test.java" -exec git checkout master {} \;

また、最初にfind、simpleechoを使用してコマンドをテストできます。これは、指定されたテキストを出力するだけです({}この場合、シェルによって現在検出されているファイル名に置き換えられます)。

find . -name "*Test.java" -exec echo {} \;
于 2020-06-17T17:40:17.543 に答える
0

コミットでファイルが変更されたかどうかに関係なく、コミットからファイルを取得する必要がある場合は、次を使用できます。

git ls-tree --name-only -r myBranch | grep myFilePattern | xargs git checkout myBranch
于 2022-02-28T22:51:07.193 に答える