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.
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
Etxargs
pour atteindre votre objectif:git diff --name-only <COMMIT> -- <GLOB>... | xargs git checkout <COMMIT>
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.
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é).
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;
}