Comment supprimer un répertoire du référentiel git?

1236

J'ai 2 répertoires sur mon référentiel GitHub. Je voudrais supprimer l'un d'eux. Comment pourrais-je faire cela sans supprimer et recréer le référentiel entier?

Sahat Yalkabov
la source
1
Y a-t-il des fichiers dans les répertoires?
Fred Foo
3
@Iarsmans: Oui 6 fichiers. Les deux répertoires sont identiques, sauf que l'un est en majuscules, un autre en minuscules.
Sahat Yalkabov

Réponses:

2328

Supprimer le répertoire de git et local

Vous pouvez extraire «master» avec les deux répertoires;

git rm -r one-of-the-directories // This deletes from filesystem
git commit . -m "Remove duplicated directory"
git push origin <your-git-branch> (typically 'master', but not always)

Supprimer le répertoire de git mais PAS local

Comme mentionné dans les commentaires, ce que vous voulez généralement faire est de supprimer ce répertoire de git mais pas de le supprimer entièrement du système de fichiers (local)

Dans ce cas, utilisez:

git rm -r --cached myFolder
karmakaze
la source
8
J'avais la même situation exacte. Lorsque j'ai essayé, git rm -r myFoldercela a fonctionné, mais j'ai également tout supprimé du répertoire "MyFolder". J'ai dû tout rétablir dans le répertoire "MyFolder", puis valider.
Justin
240
@Justin Pour supprimer uniquement de git et laisser le système de fichiers tel git rm -r --cached myFolder
quel
32
Le message d'erreur que j'obtiens est: fatal: pathspec 'directory' ne correspond à aucun fichier.
user2441441
3
@ user2441441 J'ai rencontré cette erreur lorsque j'essayais de supprimer un dossier / fichier qui n'était pas du tout ajouté au
dépôt
3
git rm -r --cached directory/supprime uniquement de git tracké, mais la structure du référentiel reste.
Néstor
287

Pour supprimer le dossier / répertoire uniquement du référentiel git et non du local, essayez 3 commandes simples.


Étapes pour supprimer le répertoire

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

Étapes pour ignorer ce dossier dans les prochains validations

Pour ignorer ce dossier à partir des validations suivantes, créez un fichier à la racine nommé .gitignore et mettez-y le nom de ce dossier. Vous pouvez en mettre autant que vous le souhaitez

Le fichier .gitignore ressemblera à ceci

/FolderName

supprimer le répertoire

eirenaios
la source
1
Vous devrez également faire le git rm -r --cached FolderName git commit -m "Dossier supprimé du référentiel" sur votre autre ordinateur, puis faire un pull pour le garder synchronisé.
Simon
1
Cela supprimera-t-il le répertoire du point où il a été ajouté au référentiel jusqu'à présent? Ou s'agit-il simplement de supprimer le répertoire et de le réengager dans le dépôt .git?
alpha_989
1
Génial! Travail!
BeingCoders
2
Bien expliqué, belle réponse
Rakshit Shah
1
bien joué. Sur ma machine, la troisième étape ne fonctionne pas. Mais cela fonctionne s'il est changé en $ git push
Hong
82

Si, pour une raison quelconque, ce que Karmakaze a dit ne fonctionne pas, vous pouvez essayer de supprimer le répertoire que vous souhaitez utiliser ou avec le navigateur de votre système de fichiers (par exemple, dans l'Explorateur de fichiers Windows). Après avoir supprimé le répertoire, lancez la commande:
git add -A
puis
git commit -m 'deleting directory'
puis puis
git push origin master.

cmcculloh
la source
4
Cela a fonctionné pour moi. Pourriez-vous expliquer l'argument -A?
Arun
2
@Arun -A est l'abréviation de --all et ajoute des modifications de tous les fichiers suivis et non suivis
Joachim Rohde
Cela a fonctionné pour moi.
UVM
20

Vous pouvez essayer ceci: git rm -rf <directory_name>

Cela forcera la suppression du répertoire.

Breen ho
la source
3
cela supprimera également du répertoire local
abdul rehman kk
18

Si vous supprimez les fichiers du répertoire (avec git rmcomme les autres réponses l'expliquent), le répertoire n'existe plus en ce qui concerne git. Vous ne pouvez pas valider un répertoire vide, ni en supprimer un.

C'est différent de la subversion où vous devez explicitement svn rm emptyfolder/, et c'est d'ailleurs pourquoi la manpage pour git se décrit comme "le stupide tracker de contenu"

Une réponse sur "Comment ajouter un répertoire vide à un référentiel git" renvoie à la FAQ à ce sujet :

Actuellement, la conception de l'index git (zone de transit) ne permet que la liste des fichiers, et personne suffisamment compétent pour effectuer la modification pour autoriser les répertoires vides ne s'est suffisamment soucié de cette situation pour y remédier.

Les répertoires sont ajoutés automatiquement lors de l'ajout de fichiers à l'intérieur. Autrement dit, les répertoires ne doivent jamais être ajoutés au référentiel et ne sont pas suivis par eux-mêmes.

Vous pouvez dire " git add <dir>" et il y ajoutera des fichiers.

Si vous avez vraiment besoin qu'un répertoire existe dans les caisses, vous devez y créer un fichier. .gitignore fonctionne bien à cet effet; vous pouvez le laisser vide ou remplir les noms des fichiers que vous prévoyez d'afficher dans le répertoire.

dbr
la source
9

J'avais déjà validé le dossier auparavant et je souhaite également supprimer le répertoire de l'historique.

J'ai fait ce qui suit:

Ajouter un dossier à .gitignore:

echo Folder_Name/ >> .gitignore

Supprimer de tous les commits:

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch Folder_Name/' --prune-empty --tag-name-filter cat -- --all

supprimez les références des anciens commits:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

Assurez-vous que toutes les anciennes références sont complètement supprimées

rm -Rf .git/logs .git/refs/original

Effectuer une collecte des ordures

git gc --prune=all --aggressive

vous pousser les modifications dans le référentiel en ligne:

git push

Vous avez terminé ici.

Mais vous pouvez faire ce qui suit pour pousser toutes les modifications à toutes les branches avec: Mais soyez prudent avec cette commande!

git push origin --all --force
git push origin --tags --force

Après cela, le dossier a été supprimé de git, mais n'a pas été supprimé du disque local.

Skyborg
la source
7

pour supprimer des dossiers vides

je voulais supprimer un répertoire vide (dossier) que j'ai créé, git ne peut pas le supprimer, après quelques recherches, j'ai appris que Git ne suit pas les répertoires vides. Si vous avez un répertoire vide dans votre arborescence de travail, vous devez simplement le supprimer avec

rm -r folderName

Il n'est pas nécessaire d'impliquer Git.

Ridha Rezzag
la source
1
Merci! C'est juste ce dont j'avais besoin.
SpyrosKo
6

Accédez à votre répertoire git, puis tapez la commande suivante: rm -rf < nom du répertoire >

Après avoir supprimé le répertoire, validez les modifications en: git commit -m "Your Commit Message"

Ensuite, poussez simplement les modifications sur le répertoire GIT distant: git push origin < nom de la branche >

anky
la source
4

Vous pouvez supprimer le dossier localement, puis pousser, comme suit:

git rm -r folder_name
git commit -m "your commit"
git push origin master
shrikant
la source
4

J'utilise généralement git add --allpour supprimer des fichiers / dossiers des référentiels distants

rm -r folder_name
git add --all
git commit -m "some comment"
git push origin master

master peut être remplacé par n'importe quelle autre branche du référentiel.

ettanany
la source
2

Vous pouvez utiliser l'arbre source Attlasian (Windows) ( https://www.atlassian.com/software/sourcetree/overview ). Sélectionnez simplement les fichiers dans l'arborescence et appuyez sur le bouton "Supprimer" en haut. Les fichiers seront supprimés du référentiel local et de la base de données git locale. Ensuite, validez, puis appuyez.

Sergey Groshev
la source
C'est ce que je fais aussi. Cela a rendu la tâche très simple, cependant, apprendre les commandes git est une bonne chose à savoir.
Micah Montoya
1

Un de mes collègues a suggéré BFG Repo-Cleaner que je trouve puissant. Il s'agit non seulement de supprimer les données indésirables, mais également de nettoyer votre référentiel de toute information de validation associée.

thanh.h.le
la source
1

Pour ajouter un nouveau répertoire:

mkdir <YOUR-DIRECTORY>

Mais maintenant, Git n'est pas au courant de ce nouveau répertoire, car Git garde la trace des fichiers et non des répertoires RÉPERTOIRE

git status

Git ne sera pas au courant de la modification que nous avons apportée, nous ajoutons donc un .keepfichier caché pour rendre Git conscient de cette nouvelle modification.

touch /YOUR-directory/.keep

Maintenant, si vous touchez, git statusGit sera au courant des changements.

Et si vous souhaitez supprimer le répertoire, vous devez utiliser cette commande.

rm -r <YOUR-DIRECTORY>

Et si vous avez vérifié en utilisant git status, vous verrez que le répertoire a été supprimé.

Abo3atef
la source
0

La première commande git doit savoir qui vous êtes avant de supprimer quoi que ce soit

  1. git init
  2. git config user.name "quelqu'un"
  3. git config user.email "quelqu'[email protected]"
  4. git rm -r
  5. git commit -m "suppression de dir"
  6. git push origin master
Zeus
la source
0

Une combinaison des 2 réponses a fonctionné pour moi

git rm -r one-of-the-directories
git commit . -m "Remove duplicated directory"
git push

s'il affiche toujours un avertissement, supprimez les fichiers manuellement

git filter-branch --tree-filter 'rm -rf path/to/your/file' HEAD
git push
user3821178
la source