git n'ajoute que les modifications modifiées et ignore les fichiers non suivis

658

J'ai exécuté "git status" et énuméré ci-dessous sont quelques fichiers qui ont été modifiés / ou sous le titre "changements non organisés pour la validation". Il a également répertorié certains fichiers non suivis que je veux ignorer (j'ai un fichier ".gitignore" dans ces répertoires).

Je souhaite mettre les fichiers modifiés en attente afin de pouvoir les valider. Lorsque j'ai exécuté "git add.", Il a ajouté les fichiers modifiés ET les fichiers que je veux ignorer à la mise en scène.

Comment ajouter uniquement les fichiers modifiés et ignorer les fichiers non suivis s'ils présentent l'état git ci-dessous.

De plus, mes fichiers ".gitignore" fonctionnent-ils correctement?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")
Steve
la source
1
si vous avez ajouté le fichier .gitignore APRÈS avoir suivi les fichiers, le fichier .gitignore n'ignorera pas les fichiers qui sont déjà suivis. cela pourrait être un problème.
BKSpurgeon

Réponses:

904

Idéalement, votre .gitignoredevrait empêcher les fichiers non suivis (et ignorés) d'être affichés dans l'état, ajoutés à l'aide de git addetc. Je vous demanderais donc de corriger votre.gitignore

Vous pouvez le faire git add -upour qu'il met en scène les fichiers modifiés et supprimés.

Vous pouvez également faire git commit -apour valider uniquement les fichiers modifiés et supprimés.

Notez que si vous avez Git de version antérieure à 2.0 et utilisé git add ., alors vous devrez utiliser git add -u .(Voir " Différence de" git add -A"et" git add ." ").

manojlds
la source
74
point d'intérêt, this ( add -u) n'ajoute pas seulement les modified fichiers, il en "ajoute" aussi deleted.. quelque chose que j'essaie actuellement d'empêcher.
Zach Lysobey
6
Pour ajouter uniquement des fichiers modifiés, je vais généralement en haut du répertoire supérieur de mon référentiel et je tape for fil in $(git diff --name-only --relative); do git add $fil; done. Si je devais l'utiliser beaucoup (je ne le fais pas), je ferais juste un alias pour cela dans mon ~/.bashrcfichier. Bien sûr, cela ne fonctionne que dans bash.
Krøllebølle
8
Pas de réponse définitive, seulement des réponses «fonctionne pour la plupart des gens»? Je dois utiliser un autre processus pour le faire correctement? Comment cela n'est-il pas intégré à git add? Cela semble être une chose si courante de vouloir faire.
Samuel
2
nb les méthodes mentionnées dans ces commentaires échoueront si vous avez des noms de fichiers impairs (espaces, astérisques, etc.). Pour échapper correctement tous les fichiers aux noms étranges, utilisez:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile
3
git add -uest l'abréviation de git add --updateet git commit -aest l'abréviation degit commit --all
Hugo
96

Cela a fonctionné pour moi:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

Ou encore mieux:

$ git ls-files --modified | xargs git add
user877329
la source
Vous n'avez pas besoin de groupement (()) si vous ne comptez pas réutiliser le groupe, et \ s laissez des espaces devant le nom de fichier pour moi. Non pas que cela affectera le résultat final dans ce cas, mais pour définir un exemple, voici la commande sed que j'ai utilisée: sed 's /.* modifié: * //'. Vérifié sous Mac OS X 10.9.5.
Samuel
@Samuel Grouping est agréable lors du test de l'expression. Ensuite, je peux imprimer la correspondance entre crochets pour voir que j'ai raison.
user877329
1
@ Ярослав votre solution ajoute des fichiers modifiés et non suivis et est égale à git add -u, donc elle ne répond pas à la question.
Nick Volynkin
7
--modifié semble inclure supprimé ainsi que juste modifié
DMart
2
git diff-files -z --diff-filter = M --nom uniquement | xargs -0 git add --dry-run semble bien fonctionner.
DMart
10
git commit -a -m "message"

-a: inclut tous les fichiers actuellement modifiés / supprimés dans ce commit. Gardez cependant à l'esprit que les (nouveaux) fichiers non suivis ne sont pas inclus.

-m: définit le message du commit

Saurabh
la source
4

Vous n'avez pas dit ce qui est actuellement votre .gitignore, mais un .gitignoreavec le contenu suivant dans votre répertoire racine devrait faire l'affaire.

.metadata
build
Karl Bielefeldt
la source
3
J'utilisais mal mon .gitignore. J'avais un fichier .gitignore vide dans chaque répertoire que je voulais ignorer au lieu d'avoir un seul gitignore avec du contenu.
Steve
1
@Steve: Cela fonctionnerait si chacun. gitognorecontenait un début (ignorer tout). Mais un simple .gitignoredans le répertoire supérieur est généralement beaucoup plus simple à utiliser et suffit.
maaartinus
2

Il m'est arrivé d'essayer ceci afin que je puisse voir la liste des fichiers en premier:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

exécuter:

chmod a+x file.sh
./file.sh 

Edit: (voir commentaires) Cela pourrait être réalisé en une seule étape:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status
Mike Q
la source
1
Cela pourrait être réalisé en une seule étape:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom
Oui, j'aurais dû fournir cette solution également, merci, j'ai mis à jour le message.
Mike Q
1

Je ne sais pas s'il s'agit d'une fonctionnalité ou d'un bug, mais cela a fonctionné pour nous:

git commit '' -m "Message"

Notez la liste de fichiers vide ''. Git interprète cela pour valider tous les fichiers suivis modifiés, même s'ils ne sont pas intermédiaires, et ignorer les fichiers non suivis.

Erik Englund
la source
Cela ne fonctionne certainement pas lors de l'utilisation de --amend.
GhostCat
1

Pour mettre en scène des fichiers modifiés et supprimés

git add -u

Dayamoy
la source