J'exécute cette commande sur le deuxième fichier que je veux supprimer (le premier était les fichiers de dossiers .idea de JetBrains qui sont maintenant dans .gitignore), mais je ne suis pas en mesure de:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch gf5/console/basic.php' --Prune-empty --tag-name-filter cat -- --all
Cannot rewrite branches: You have unstaged changes.
Alors, comment puis-je savoir à quels fichiers "non mis en scène" git fait référence quand il ne les répertorie pas, et comment puis-je résoudre ce problème?
PS la question n'est pas cachée (es), je n'en ai pas et n'ai jamais fait de cachette sur ce repo.
NOTE: J'ai fait un git status
et je reçois ceci:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: gf5/console/basic.php
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)
//(and a whole long list of files)
AHA !! J'ai compris ce qui se passe. Lisez les dernières phrases pour un petit aperçu.
La réponse était d'abord faire:
git status
Cela montrait les fichiers modifiés en ROUGE, ce qui, je suppose, signifie qu’ils sont en quelque sorte "supprimés" dans l’esprit de git. J'ai ensuite fait:
git add --all
À partir de là, j'ai validé tous les fichiers mis en scène à l'aide de SourceTree (désolé, je ne suis pas resté en ligne de commande jusqu'au bout). Je suis allé de l'avant et en même temps j'ai transmis les modifications au serveur, mais ce serait une option.
La commande ci-dessus a ensuite fonctionné avec succès.
Lorsque j'ai essayé d'exécuter la commande ci-dessus sur un fichier différent, j'ai eu le même problème. J'ai donc à nouveau lancé git status
et il s'avère que le fichier que je viens de supprimer de l'historique est toujours là et vous devez donc procéder comme suit:
git rm /previous_file_you_just_removed_from_history.php
Également pour clarifier, la commande filter-branch supprimera l'historique de ce fichier de tous les commits, mais elle NE supprimera PAS les modifications que vous avez apportées à ce fichier. C'est à dire. ce fichier supprimé est toujours la somme de toutes les modifications que vous y avez apportées jusqu'à ce point. J'espère que cela aide à clarifier ce concept pour quelqu'un d'autre.
Le même problème se posait. Tous mes fichiers étaient modifiés après un clone récent et la cause (dans mon cas) était que Tortoise Git modifiait automatiquement les fins de ligne de chaque fichier lors de la validation et de la validation.
Pour éviter ce problème, désactivez le paramètre AutoCrLf
dans la fenêtre des paramètres du référentiel (Git
-> Config Source [Local]
-> AutoCrlf
) comme décrit dans cette question.