Comment ajouter récursivement des fichiers par un modèle (ou glob) situé dans différents répertoires?
Par exemple, je voudrais ajouter A/B/C/foo.java
et D/E/F/bar.java
(et plusieurs autres fichiers java) avec une seule commande:
git add '*.java'
Malheureusement, cela ne fonctionne pas comme prévu.
git
glob
filepattern
Michel Krämer
la source
la source
.java
fichiers (déjà suivis) dans votre répertoire actuel, vous êtes peut-être en train de rencontrer le traitement des caractères génériques, euh , compliqué entre bash et le «helper» de ligne de commande msys . Je ne suis pas sûr d’une solution. Vous pouvez essayer plusieurs couches de guillemets:git add '"*.java"'
(les guillemets simples sont pris par bash pour empêcher l'expansion de glob, les guillemets doubles sont pris par la couche msys pour empêcher l'expansion de glob).git add *.java
fonctionne pour moi (sur PowerShell avec le client GitHub)Réponses:
La réponse de Sergio Acosta est probablement votre meilleur pari si certains des fichiers à ajouter ne sont peut-être pas déjà suivis. Si vous voulez vous limiter aux fichiers que git connaît déjà, vous pouvez combiner
git-ls-files
avec un filtre:Git ne fournit aucun mécanisme sophistiqué pour le faire lui-même, car il s'agit essentiellement d'un problème de shell: comment obtenir une liste de fichiers à fournir comme arguments à une commande donnée.
la source
git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
Vous pouvez utiliser
git add [path]/\*.java
pour ajouter des fichiers java à partir de sous-répertoires,par exemple
git add ./\*.java
pour le répertoire courant.De la
git add
documentation :la source
Avec
zsh
vous pouvez exécuter:et tous vos
*.java
fichiers seront ajoutés de manière récursive.la source
zsh
shell pour Windows ... vous vous ferez une faveur pour l'utiliser au lieu de bash, à mon humble avis.ls
).Un peu hors sujet (pas spécifiquement lié à git) mais si vous êtes sous Linux / Unix, une solution de contournement pourrait être:
Et si vous attendez des chemins avec des espaces:
Mais je sais que ce n'est pas exactement ce que vous avez demandé.
la source
La réponse de Sergey (ne me créditez pas) fonctionne:
avec un git récent:
Fichiers pour le test:
Statut Git:
Ajout de * .txt:
Statut mis à jour:
la source
Si vous suivez déjà vos fichiers et que vous y avez apporté des modifications et que vous souhaitez maintenant les ajouter de manière sélective en fonction d'un modèle, vous pouvez utiliser l'
--modified
indicateurPar exemple, si vous souhaitez uniquement ajouter les modifications CSS à ce commit, vous pouvez faire
Voir
man git-ls-files
pour plus de drapeauxla source
Utilisez simplement
git add *\*.java
. Cela ajoutera tous les fichiers .java dans le répertoire racine et tous les sous-répertoires.la source
Ajout d'une solution de ligne de commande Windows qui n'a pas encore été mentionnée:
la source
Je voulais uniquement ajouter des fichiers qui avaient une certaine chaîne basée sur
git status
:git status | grep string | xargs git add
puis a pu
git commit -m 'commit msg
valider tous les fichiers modifiés avec "chaîne" dans le titre du fichierla source
Comme mentionné dans " git: Comment puis-je ajouter de manière récursive tous les fichiers dans un sous-arbre de répertoire qui correspondent à un modèle de glob? ", Si vous échappez ou citez correctement votre globbing de pathspec (comme
'*.java'
), alors oui, git add'*.java'
Git 2.13 (Q2 2017) améliore cela pour l'ajout interactif:
Voir commit 7288e12 (14 mars 2017) par Jeff King (
peff
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 153e0d7 , 17 mars 2017)Historiquement, le langage pathspec pris en charge par "
diff-index
" était plus faible, mais ce n'est plus le cas.la source
mettre la ligne dans ~ / .gitconfig
[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -
Si vous souhaitez ajouter tous les fichiers java modifiés, vous pouvez simplement faire:
git addt java
Samely, si vous souhaitez ajouter tous les fichiers python modifiés, vous pouvez simplement faire:
git addt py
la source