Suppression de plusieurs fichiers d'un git repo qui ont déjà été supprimés du disque
j'ai un git repo que j'ai supprimé quatre fichiers de l'utilisation de rm
( pas git rm
), et mon statut Git ressemble à ceci:
# deleted: file1.txt
# deleted: file2.txt
# deleted: file3.txt
# deleted: file4.txt
Comment puis-je supprimer ces fichiers de Git sans avoir à passer par la main et ajouter chaque fichier comme ceci:
git rm file1 file2 file3 file4
idéalement, je cherche quelque chose qui fonctionne de la même manière que git add .
, si c'est possible.
28 réponses
Pour Git 1.x
$ git add -u
cela indique à git de mettre automatiquement en scène les fichiers suivis -- y compris la suppression des fichiers suivis précédemment.
Pour Git 2.0
pour mettre en scène tout votre arbre de travail:
$ git add -u :/
À la scène, tout le chemin actuel:
$ git add -u .
git ls-files --deleted -z | xargs -0 git rm
peut-être ce que vous cherchez.. il fonctionne pour moi..
vous pouvez utiliser
git add -u
pour ajouter les fichiers supprimés à la zone d'arrêt, puis les propager""
git commit -m "Deleted files manually"
Si vous exécutez simplement:
git add -u
git mettra à jour son index pour savoir que les fichiers que vous avez supprimés devraient faire partie de la prochaine propagation. Ensuite, vous pouvez lancer "git commit" pour vérifier ce changement.
ou, si vous courez:
git commit -a
il prend automatiquement ces modifications (et toutes autres) et les engage.
Update : si vous voulez ajouter supprimé fichiers, essayez:
git ls-files --deleted -z | xargs -0 git rm
git commit
vous cherchez probablement-A:
git add -A
c'est similaire à git add-u, mais ajoute aussi de nouveaux fichiers. C'est à peu près l'équivalent de la commande addremove
de hg (bien que la détection de mouvement soit automatique).
for x in $(git status | grep deleted | awk '{print }'); do git rm $x; done
Ou (le xargs):
git status | awk '/deleted/ {print }' | xargs git rm
Vous pouvez alias votre choix de jeu de commande, pratique pour un usage ultérieur.
en utilisant git-add avec '--all' ou '--update' options vous pouvez obtenir plus que vous vouliez. Nouvelles et/ou les fichiers modifiés seront également ajoutés à l'index. J'ai un alias bash setup pour quand je veux supprimer des fichiers supprimés de git sans toucher aux autres fichiers:
alias grma='git ls-files --deleted -z | xargs -0 git rm'
tous les fichiers qui ont été supprimés du système de fichiers sont ajoutés à l'index tel que supprimé.
non pas que ce soit vraiment important, mais je ne suis pas d'accord avec la réponse choisie:
git add -u
... va supprimer des fichiers de l'index si les fichiers correspondants dans l'arbre de travail ont été supprimés, mais il mettra également en scène le nouveau contenu modifié des fichiers suivis.
git rm $(git ls-files --deleted)
... sur l'autre main n'rm les fichiers supprimés qui ont été suivis.
donc ce dernier est à mon avis la meilleure option.
Si ceux-ci sont les seuls changements, vous pouvez simplement faire
git commit -a
pour effectuer tous les changements. Qui comprendra des fichiers supprimés.
git ls-files --deleted | xargs git rm
est la meilleure option pour ajouter seulement des fichiers supprimés.
Voici d'autres options.
git add . => Add all (tracked and modified)/new files in the working tree.
git add -u => Add all modified/removed files which are tracked.
git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.
git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.
git add-u
- u --mettre Ne comparez que les fichiers déjà suivis dans l'index plutôt que dans l'arbre de travail. Cela signifie qu'il ne sera jamais en scène de nouveaux fichiers, mais qu'il mettra en scène modifié nouveau contenu des dossiers et qu'il va supprimer les fichiers de l'index si les fichiers correspondant dans l'arbre de travail ont été supprimés.
S'il n'est donné, par défaut "."; en d'autres termes, mettre à jour tous les fichiers suivis dans le répertoire courant et ses sous-répertoires.
Cette solution simple fonctionne très bien pour moi:
git rm $(git ls-files --deleted)
Si vous voulez l'ajouter à votre .gitconfig
faites ceci:
[alias]
rma = !git ls-files --deleted -z | xargs -0 git rm
alors tout ce que vous avez à faire est d'exécuter:
git rma
git ls-files --deleted -z | xargs -0 git rm --cached
cela supprimera tous les fichiers supprimés qui ont été précédemment suivis par git, ainsi que gérer le cas où vos noms de fichiers ont des espaces dans eux.
en fonction de votre variante POSIX, vous devrez peut-être utiliser xargs -0 -r
: cela provoquera xargs
à quitter gracieusement lorsque le contenu nul est pipé.
EDIT: --cached
et --deleted
sont utilisés en tandem pour se prémunir contre la suppression accidentelle de fichiers qui n'ont pas déjà été supprimé.
essayez.
-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
git add . && git commit -m -a "Your commit"
ou
git add --all && git commit -m "Your commit"
s'il vous Plaît utiliser -t
voir la commande est effectivement couru
je viens de modifier la réponse de Virender pour faire la même chose:
git ls-files --deleted -z | xargs -t -0 git rm
aucun des drapeaux à git-add ne mettra en scène les fichiers supprimés; si tout ce que vous avez modifié sont des fichiers supprimés, alors vous êtes bien, mais sinon, vous devez exécuter git-status et analyser la sortie.
travaillant à partir de la réponse de Jeremy, voici ce que j'ai eu:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
- obtenir l'état des fichiers.
- pour les fichiers supprimés, isoler le nom du fichier.
- Supprimer toutes les lignes qui commencent par #s, ainsi qu'une ligne de statut qui avait le mot "supprimé" en elle; Je ne me souviens pas ce que c'était, exactement, et il n'est plus là, donc vous pouvez avoir à modifier ceci pour différentes situations. Je pense que le groupement des expressions pourrait être une fonctionnalité spécifique à GNU, donc si vous n'utilisez pas gnutils, vous pourriez avoir à ajouter plusieurs lignes
grep -v
. - passe les fichiers à
git rm
.
coller ceci dans un shell alias maintenant...
ce qui suit fonctionnera, même si vous avez beaucoup de fichiers à traiter:
git ls-files --deleted | xargs git rm
vous voudrez probablement aussi vous engager avec un commentaire.
pour plus de détails, voir: Useful Git Scripts
Comme mentionné
git add -u
traite les fichiers supprimés pour suppression, mais aussi les fichiers modifiés pour mise à jour.
pour dégrafer les fichiers modifiés que vous pouvez faire
git reset HEAD <path>
si vous aimez garder vos commits organisés et propres.
NOTE: cela pourrait également dégrafer les fichiers supprimés, donc attention avec ces caractères génériques.
git commit -m 'commit msg' $(git ls-files --deleted)
cela a fonctionné pour moi après que j'ai déjà supprimé les fichiers.
j'avais besoin de la même et utilisé git gui "stade changé" bouton. il ajoute aussi tout.
et après" stage changed "j'ai fait" commit"...
donc mon répertoire de travail est propre à nouveau.
Vous pouvez utiliser git add -u <filenames>
pour mettre en scène les fichiers supprimés.
par exemple, si vous avez supprimé les fichiers templates/*.tpl
, utilisez git add -u templates/*.tpl
.
Le -u
est nécessaire afin de consulter les fichiers qui existent dans le référentiel, mais n'existent plus dans le répertoire de travail. Sinon, la valeur par défaut de git add
est de rechercher les fichiers dans le répertoire de travail, et si vous spécifiez des fichiers que vous avez effacés, il ne les trouvera pas.
quelque chose comme
git status | sed -s "s/^.*deleted: //" | xargs git rm
peut le faire.
ajout d'un pseudonyme de système pour la mise en scène de fichiers supprimés en tant que commande rm-all
UNIX
alias rm-all='git rm $(git ls-files --deleted)'
WINDOWS
doskey rm-all=bash -c "git rm $(git ls-files --deleted)"
Note
Windows doit avoir bash
installé.
(une autre variante)
je voulais supprimer tous les fichiers déjà supprimés des fichiers disques, mais d'un dossier spécifique, laissant les autres dossiers intacts. Ce qui suit a fonctionné pour moi:
git ls-files --deleted | grep <folder-name> | xargs git rm
Pour projet visual studio
'git ls-files --deleted | sed 's/(.*)/""/'| xargs git rm'
qui est utile lorsque le chemin du fichier supprimé A de l'espace
la solution la plus flexible que j'ai trouvée à ce jour est de
git cola
et sélectionnez tous les fichiers supprimés que je veux mettre en scène.
(notez que je fais habituellement tout en ligne de commande dans git, mais git gère les fichiers supprimés un peu maladroits).