web-dev-qa-db-fra.com

Existe-t-il un moyen d'utiliser des caractères génériques avec Git Checkout?

Ce que je voudrais faire, c'est extraire un seul fichier ou un ensemble de fichiers avec un nom commun comme celui-ci

git checkout myBranch */myFile.md et

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

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 existe des fonctionnalités génériques limitées pour certaines commandes git comme diff et add mais je n'ai rien trouvé pour checkout. Y a-t-il un moyen?

EDIT: J'utilise git 1.7.9.5 sous Linux. Une combinaison fonctionnelle des commandes git et Shell serait également acceptable.

51
kostja

Git gère les caractères génériques, en utilisant fnmatch (3) . Voir l'entrée pathspec dans Glossaire Git .

Mais pour être sûr que git peut voir les caractères génériques, ils doivent être échappés sinon votre Shell les développera en premier. En règle générale, 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 complet, répertoires inclus.

Comme vous pouvez le voir dans la documentation, la pathspec permet également signature magique qui change la façon d'interpréter la pathspec. Par exemple, vous pouvez avoir des chemins insensibles à la casse avec icase (vous pouvez taper ':(icase)*readme*' pour trouver tous vos fichiers Lisez-moi).

Je cite le commentaire de @ bambams ici, au cas où vous auriez des problèmes avec Windows:

Cela ne fonctionne pas pour moi dans Windows avec 2.8.1.windows.1 et j'utilise Git à partir du shell cmd.exe donc pas de globalisation intégré. Il y a cependant une solution si vous êtes dans un tel état désolé. Combinez git diff --name-only Et xargs pour atteindre votre objectif:

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

Git ne gère pas le caractère générique, mais votre Shell le fait.

Essaye ça :

git checkout myBranch **/myFile.md

et

git checkout myBranch  **/*Test*

Avec le **, votre Shell recherchera des fichiers dans tous les sous-répertoires à partir du répertoire de travail courant.

21
Intrepidd

Powershell

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

gci génère une liste de tous les fichiers correspondant aux critères (*test*) puis le redirige vers Resolve-Path pour obtenir le chemin relatif. Enfin la liste aplatie (@) des noms de fichiers est canalisée dans l'invocation git (s'exécute une fois par fichier trouvé).

1
9Rune5

Aucune des autres réponses n'a fonctionné pour moi, mais le commentaire de Bambams a fonctionné. Je l'ai transformé en une fonction bash qui accepte deux arguments. Usage:

gitcheckout myBranch '* fichier *'

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