Y a-t-il un moyen d'utiliser des jokers avec git checkout?

Ce que je voudrais faire est d'extraire un seul fichier ou un ensemble de fichiers avec un nom commun de la partie comme ceci

git checkout myBranch */myFile.md et

git checkout myBranch -- */*Test* (pas sûr de l''--')

au lieu de

git checkout myBranch src/main/java/a/deep/package/structure/myFile.md et

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

je sais qu'il y a des fonctionnalités de jokers limitées pour certaines commandes git comme diff et add mais ont trouvé rien pour checkout. Est-il possible?

EDIT: j'utilise Git 1.7.9.5 sous Linux. Une combinaison efficace de commmands git et shell serait également acceptable.

42
demandé sur Zoe 2013-03-01 19:16:31
la source

3 ответов

Git traiter avec des caractères génériques, en utilisant fnmatch (3). Voir le pathspec entrée Git glossaire.

mais pour être sûr que git peut voir les caractères génériques, ils doivent être échappés sinon votre shell développez d'abord. Typiquement, j'utilise des caractères génériques entre guillemets simples:

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

les caractères génériques sont appliqués au nom entier, répertoires inclus.

Comme vous pouvez le voir dans la documentation, le pathspec permet aussi signature magique qui changent comment interpréter le pathspec. Par exemple, vous pouvez avoir des chemins insensibles à la casse avec icase (vous pouvez taper ':(icase)*readme*' pour retrouver tous vos fichiers readme).

je cite @bambams de commentaire ici, dans le cas où vous avez des problèmes dans Windows:

cela ne fonctionne pas pour moi dans Windows avec 2.8.1.Windows.1 et je suis en utilisant Git à partir de la cmd.exe shell donc pas de globbing intégré. Il est cependant une solution si vous êtes dans un tel état lamentable. Combiner git diff --name-only et xargs pour atteindre votre objectif:

git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT> 
40
répondu coredump 2017-08-07 10:16:54
la source

Git ne traite pas avec le Joker, mais votre interpréteur de commandes le fait.

essaye ceci :

git checkout myBranch **/myFile.md

et

git checkout myBranch  **/*Test*

**, votre interpréteur de commandes recherchera des fichiers dans tous les sous-répertoires à partir du répertoire de travail courant.

20
répondu Intrepidd 2013-03-01 19:44:45
la source

Aucune des autres réponses a fonctionné pour moi, mais bambams commentaire travaillé. J'en ai fait une fonction bash qui accepte deux args. D'utilisation:

gitcheckout myBranch '**'

gitcheckout()
{
    GIT_DIR=$(git rev-parse --git-dir 2>/dev/null); 
    pushd .;
    cd $GIT_DIR/../;
    git diff --name-only  --  | xargs git checkout  --;
    popd;
}
0
répondu Klik 2017-02-11 01:03:15
la source

Autres questions sur git git-checkout wildcard