Certains fichiers de mon référentiel doivent être ignorés. Je les ai ajoutés au .gitignore mais, bien sûr, ils ne sont pas supprimés de mon référentiel.
Ma question est donc la suivante: existe-t-il une commande ou un script magique utilisant une branche de filtre qui puisse réécrire mon historique et supprimer facilement tous ces fichiers? Ou simplement une commande qui créera un commit qui les supprimera?
Vous pouvez les supprimer manuellement du référentiel:
git rm --cached file1 file2 dir/file3
Ou, si vous avez beaucoup de fichiers:
git rm --cached `git ls-files -i --exclude-from=.gitignore`
Mais cela ne semble pas fonctionner dans Git Bash sous Windows. Cela produit un message d'erreur. Ce qui suit fonctionne mieux:
git ls-files -i --exclude-from=.gitignore | xargs git rm --cached
En ce qui concerne la réécriture de l'historique complet sans ces fichiers, je doute fortement qu'il existe un moyen automatique de le faire.
Et nous savons tous que réécrire l'histoire est une mauvaise chose, n'est-ce pas? :)
Un moyen plus simple qui fonctionne sur n'importe quel système d'exploitation est de le faire.
git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"
Vous avez essentiellement lu tous les fichiers, à l’exception de ceux du fichier .gitignore
Comme les fichiers de . Gitignore ne font pas l'objet d'un suivi, vous pouvez utiliser la commande git clean pour supprimer de manière récursive des fichiers qui ne sont pas sous contrôle de version.
Utilisez git clean -xdn
pour effectuer un essai et voir ce qui sera supprimé.
Puis utilisez git clean -xdf
pour l'exécuter.
Fondamentalement, git clean -h
ou man git-clean
(sous Unix) vous aidera.
Sachez que cette commande supprimera également nouveaux fichiers qui ne se trouvent pas dans la zone de stockage intermédiaire.
J'espère que ça aide.
J'ai fait une solution très simple en manipulant la sortie de la déclaration .gitignore avec sed:
cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash
Explication: