Mise en attente des fichiers supprimés

499

Disons que j'ai un fichier dans mon référentiel git appelé foo .

Supposons qu'il ait été supprimé avec rm(pas git rm). Le statut de git affichera alors:

Changes not staged for commit:

    deleted: foo

Comment organiser cette suppression individuelle de fichiers?

Si j'essaye:

git add foo

Ça dit:

'foo' did not match any files.
Andrew Tomazos
la source
2
Était-ce un problème dans les anciennes versions de Git? De nos jours, il ne semble pas en être un, il fonctionne de manière similaire aux fichiers modifiés.
cst1992

Réponses:

22

Depuis Git 2.0.0, git addmettra également en scène les suppressions de fichiers.

Git 2.0.0 Docs - git-add

<pathspec>…

Fichiers pour ajouter du contenu. Des fichiers (par exemple * .c) peuvent être fournis pour ajouter tous les fichiers correspondants. Un nom de répertoire principal (par exemple dir pour ajouter dir / fichier1 et dir / fichier2) peut également être donné pour mettre à jour l'index afin qu'il corresponde à l'état actuel du répertoire dans son ensemble (par exemple, en spécifiant dir enregistrera non seulement un fichier dir / fichier1 modifié dans l'arborescence de travail, un fichier dir / fichier2 ajouté à l'arborescence de travail, mais aussi un fichier dir / fichier3 supprimé de l'arborescence de travail. Notez que les anciennes versions de Git ignoraient les fichiers supprimés; utilisez l'option --no-all si vous souhaitez ajouter des fichiers modifiés ou nouveaux, mais ignorez ceux supprimés.

peflorencio
la source
La réponse acceptée ne résout pas le problème - et les autres sont plus lourdes depuis Git 2.0.0 - c'est le meilleur moyen! Vous avez mon vote positif
João Antunes
519

Utilisation git rm foo pour mettre en scène le fichier à supprimer. (Cela supprimera également le fichier du système de fichiers, s'il n'avait pas été supprimé auparavant. Il peut, bien sûr, être restauré à partir de git, car il a été précédemment archivé.)

Pour préparer le fichier à supprimer sans le supprimer du système de fichiers, utilisez git rm --cached foo

Wooble
la source
8
Vous pouvez également ajouter un --cacheindicateur pour supprimer uniquement le fichier du référentiel et laisser intact le système de fichiers.
Hauleth
Quel serait le processus pour annuler cette opération, c'est-à-dire annuler la suppression du fichier pour suppression? Est-ce possible?
longda
82
En fait, OP a demandé comment mettre en scène le fichier déjà supprimé et cela peut être fait par git status | grep 'deleted:' | cut -d':' -f2 | xargs -t -I {} git add -u "{}". D'autres réponses semblent montrer comment organiser correctement la suppression des fichiers (mais pas comment mettre en scène les fichiers déjà supprimés). ps. la xargscommande basée fonctionne pour moi sur Ubuntu 12.04, mais quand je le fais manuellement, git add -u deleted_file.txtcela ne fonctionne pas. Mon git est 1.7.9.5
Dimitry K
8
@DimitryK: git rmmettra volontiers en scène un fichier à supprimer même s'il a déjà été supprimé du système de fichiers. Et comme le remarque OP sur une autre réponse, ils voulaient mettre en scène un fichier spécifique qui avait déjà été supprimé.
Wooble
3
git rmne met pas en scène les fichiers déjà supprimés. Il jette cette erreur: fatal: pathspec '~.SLDASM' did not match any files. Voici des écrans avec preuve: i.imgur.com/cKNKGGe.png i.imgur.com/1p9JdWF.png . La première capture d'écran montre clairement que 2 fichiers sont supprimés et non mis en scène, la deuxième capture d'écran montre que lorsque je tape git rm "~$Box.SLDASM", cela génère cette erreur.
KulaGGin
413

Même si son utilisation est correcte git rm [FILE], vous pouvez également le faire git add -u.

Selon la git-adddocumentation:

-u --mise à jour

Mettez à jour l'index là où il a déjà une entrée correspondant à [FILE]. Cela supprime et modifie les entrées d'index pour correspondre à l'arborescence de travail, mais n'ajoute aucun nouveau fichier.

Si aucun [FILE] n'est donné lorsque l'option -u est utilisée, tous les fichiers suivis dans l'arborescence de travail entière sont mis à jour (les anciennes versions de Git étaient utilisées pour limiter la mise à jour au répertoire actuel et à ses sous-répertoires).

Sur lequel l'index sera actualisé et les fichiers seront correctement organisés.

Sailesh
la source
56
Oui git add -A .ajoutera toutes les modifications, je voulais spécifiquement mettre en scène un fichier supprimé.
Andrew Tomazos
25
Cela ajoutera tous les fichiers modifiés; Pas seulement des fichiers supprimés.
Foreever
3
C'est exact. Plus précisément, il mettra en scène toutes les modifications des fichiers qui sont déjà suivis, qu'ils soient supprimés ou simplement modifiés. Cela vous aide lorsque vous supprimez plusieurs fichiers et que vous ne souhaitez pas les mettre en scène individuellement.
Sailesh
9
Existe-t-il un moyen de mettre en scène uniquement les fichiers supprimés et non modifiés? Juste curieux.
août
11
Je l'ai fait git add -u FolderWithDeletedFiles/et il a fait ce que je veux, merci
parlement
158

Pour mettre en scène tous les fichiers supprimés manuellement, vous pouvez utiliser:

git rm $(git ls-files --deleted)

Pour ajouter un alias à cette commande en tant que git rm-deleted, exécutez:

git config --global alias.rm-deleted '!git rm $(git ls-files --deleted)'
Ian Mackinnon
la source
2
la notation $ () n'existe apparemment pas dans la console bash de windows, conduisant àunknown option `deleted)
Félix Gagnon-Grenier
2
Je ne pense pas que cela fonctionne si vous avez des espaces sur votre chemin. Au moins, ce n'est pas sur mon système (avec zsh).
Wil Shipley
3
A parfaitement fonctionné pour moi! J'ai fait exactement ce dont j'avais besoin. ÉNORME appréciation ici!
RedSands
Dans Windows fairefor /F %I in ('git ls-files --deleted') do git add -u %I
eis
3
cela ne fonctionne pas pour les noms de fichiers avec des espaces, 'git add -u' le fait si nécessaire.
J-Dizzle
33

ajouter tous les fichiers supprimés prêts

git status -s | grep -E '^ D' | cut -d ' ' -f3 | xargs git add --all

merci de vérifier pour vous assurer

git status

tu devrais être prêt à partir

chet corey
la source
5
Confirmant que cela fonctionne. Je pense que la leçon ici est de ne pas le faire rm <file>, mais plutôtgit rm <file>
DanGordon
1
Pour info: la réduction des espaces cause des problèmes si des chemins contiennent des espaces
davis
1
cela ne fonctionne pas pour les noms de fichiers avec des espaces, 'git add -u' le fait si nécessaire.
J-Dizzle
Fonctionne parfaitement pour moi git version 2.15.2 (Apple Git-101.1).
Kalob Taulien
fonctionne parfaitement sur console linux!
Ahmed AMMOURI
8

Vous pouvez utiliser

git rm -r --cached -- "path/to/directory"

pour mettre en scène un répertoire supprimé.

GameScripting
la source
8

Vous pouvez utiliser cette commande

git add  `git ls-files --deleted`
gnana jeyam95
la source
0

pour ceux qui utilisent git 2.x + dans powershell:

foreach ($filePath in (git ls-files --deleted)) { git add "$filePath" }
orion elenzil
la source