Après git reset --hard
, git status
me donne des fichiers dans la Changes not staged for commit:
section.
J'ai également essayé git reset .
, git checkout -- .
et git checkout-index -f -a
en vain.
Alors, comment puis-je me débarrasser de ces changements non programmés?
Cela semble toucher uniquement les fichiers de projet Visual Studio. Bizarre. Voir cette pâte: http://pastebin.com/eFZwPn9Z . Ce qui est spécial avec ces fichiers, c'est qu'en .gitattributes j'ai:
*.sln eol=crlf
*.vcproj eol=crlf
*.vcxproj* eol=crlf
En outre, autocrlf
est défini sur false dans mon global .gitconfig
. Cela pourrait-il être pertinent d'une manière ou d'une autre?
.
représente le répertoire actuel et non le répertoire racinegit
version? Soit vous faites une erreur idiote, soit vous avez une ancienne version qui est buggée?Réponses:
J'ai eu le même problème et il était lié au
.gitattributes
fichier. Toutefois, le type de fichier à l'origine du problème n'a pas été spécifié dans le.gitattributes
.J'ai pu résoudre le problème en exécutant simplement
la source
git rm .gitattributes
supprime .gitattributes de l'index.git add -A
ajoute tout (y compris la suppression de .gitattributes) à l'index, qui ne devrait alors être que la suppression de .gitattributes, si tel était vraiment le problème.git reset --hard
réinitialise toutes les modifications non validées, ce qui inclut la suppression de .gitattributes. Essentiellement, cela ignore .gitattributes (et la* text=auto
directive) pour un commit en le supprimant, puis en réinitialisant l'index pendant qu'il est supprimé, donc en le remettant, mais après avoir déjà réinitialisé les autres fichiers, ils n'ont donc pas été modifiés à nouveau..gitattributes
: "fatal: pathspec '.gitattributes' ne correspond à aucun fichier"fatal: pathspec '.gitattributes' did not match any files
. Qu'est-ce que je fais mal?RÉSOLU!!!
J'ai résolu ce problème en suivant les étapes suivantes
1) Supprimez tous les fichiers de l'index de Git.
2) Réécrivez l'index Git pour récupérer toutes les nouvelles fins de ligne.
La solution faisait partie des étapes décrites sur le site git https://help.github.com/articles/dealing-with-line-endings/
la source
Git ne réinitialisera pas les fichiers qui ne sont pas sur le référentiel. Afin que vous puissiez:
Cela mettra en scène toutes les modifications, ce qui amènera Git à être au courant de ces fichiers, puis à les réinitialiser.
Si cela ne fonctionne pas, vous pouvez essayer de cacher et de supprimer vos modifications:
la source
git reset --hard
" réinitialiser à la fois la zone de transit et le répertoire de travail "? Si un fichier n'est pas mis en scène, nous souhaitons évidemment le supprimer lorsque nous le faisonsreset --hard
.Si vous utilisez Git pour Windows, c'est probablement votre problème
J'ai eu le même problème et la sauvegarde, la réinitialisation matérielle, le nettoyage ou même tous laissaient des changements. Ce qui s'est avéré être le problème était le mode de fichier x qui n'était pas correctement défini par git. Il s'agit d'un "problème connu" avec git pour Windows. Les modifications locales s'affichent dans gitk et git comme l'ancien mode 100755, le nouveau mode 100644, sans aucune différence de fichier réelle.
Le correctif consiste à ignorer le mode fichier:
Plus d'infos ici
la source
rm -rf *; git checkout HEAD .
ne l'a pas fait. Phew!D'accord, j'ai en quelque sorte résolu le problème.
Il semble que le
.gitattributes
dossier, contenant:fait apparaître les fichiers de projet sans mise en scène. Je ne sais pas pourquoi, et j'espère vraiment que quelqu'un connaissant les manières de git nous donnera une belle explication.
Ma solution consistait à supprimer ces fichiers et à les ajouter
autocrlf = false
sous[core]
dans.git/config
.Cela ne revient pas exactement à la même chose que la configuration précédente, car cela nécessite que chaque développeur ait
autocrlf = false
. J'aimerais trouver une meilleure solution.ÉDITER:
J'ai commenté les lignes incriminantes, je ne les ai pas commentées et cela a fonctionné. Qu'est-ce que ... je n'ai même pas ...!
la source
autocrlf = false
. J'ai fusionné dans les changements du repo svn en amont (git svn fetch
/git merge git-svn
) et j'ai été laissé avec 1 fichier marqué comme modifié. Ce qui est étrange, c'est que j'ai déjà rencontré ce problème et tout ce que je devais faire était de vérifier une autre branche (avec le-f
drapeau), puis de revenir en arrière. Je l'ai fait, et cela a fonctionné, mais quand je suis passé à une branche de fonctionnalité, le "changement" était de retour! Votre modification au bas de la réponse était la solution. Dans mon cas, j'ai commenté / décommenté une ligne en haut de mon fichier .gitattributes:* text=auto !eol
.gitattributes
, exécutezgit status
, décommentez les lignes.gitattributes
, exécutez àgit status
nouveau.gitattributes
. Legit diff
montre probablement le célèbre mur de rouge / mur de vert qui est typique des différences de fin de ligne.Cause possible n ° 1 - Normalisation de fin de ligne
Une situation dans laquelle cela peut se produire est lorsque le fichier en question a été archivé dans le référentiel sans la configuration correcte pour les fins de ligne (1) résultant en un fichier dans le référentiel avec soit des fins de ligne incorrectes, soit des fins de ligne mixtes. Pour confirmer, vérifiez que
git diff
ne montre que les changements dans les fins de ligne (ceux-ci peuvent ne pas être visibles par défaut, essayezgit diff | cat -v
de voir les retours chariot comme littéraux^M
caractères ).Par la suite, quelqu'un a probablement ajouté
.gitattributes
ou modifié lecore.autocrlf
paramètre pour normaliser les fins de ligne (2). Sur la base de la.gitattributes
configuration globale ou, Git a appliqué des modifications locales à votre copie de travail qui appliquent la normalisation de fin de ligne demandée. Malheureusement, pour une raison quelconquegit reset --hard
ces modifications de normalisation de ligne ne sont pas annulées.Solution
Les solutions de contournement dans lesquelles les terminaisons de ligne locales sont réinitialisées ne résoudront pas le problème. Chaque fois que le fichier est "vu" par git, il essaiera de réappliquer la normalisation, entraînant le même problème.
La meilleure option est de laisser git appliquer la normalisation qu'il souhaite en normalisant toutes les fins de ligne dans le repo pour correspondre à
.gitattributes
, et en validant ces changements - voir Essayer de réparer les fins de ligne avec git filter-branch, mais sans chance .Si vous voulez vraiment essayer d'annuler les modifications du fichier manuellement, la solution la plus simple semble être d'effacer les fichiers modifiés, puis de dire à git de les restaurer, bien que je note que cette solution ne semble pas fonctionner de manière cohérente à 100%. l'heure ( AVERTISSEMENT: NE l' exécutez PAS si vos fichiers modifiés ont des changements autres que des fins de ligne !!):
Notez que, à moins que vous ne normalisiez les fins de ligne dans le référentiel à un moment donné, vous continuerez à rencontrer ce problème.
Cause possible n ° 2 - Insensibilité à la casse
La deuxième cause possible est l'insensibilité à la casse sous Windows ou Mac OS / X. Par exemple, supposons qu'un chemin comme celui-ci existe dans le référentiel:
/foo/bar
Maintenant, quelqu'un sur Linux valide les fichiers
/foo/Bar
(probablement à cause d'un outil de construction ou de quelque chose qui a créé ce répertoire) et pousse. Sous Linux, il s'agit en fait maintenant de deux répertoires distincts:La vérification de ce dépôt sur Windows ou Mac peut entraîner une modification
fileA
qui ne peut pas être réinitialisée, car à chaque réinitialisation, git sur Windows extrait/foo/bar/fileA
, puis parce que Windows ne respecte pas la casse, écrase le contenu defileA
avec/foo/Bar/fileA
, ce qui entraîne leur "modification".Un autre cas peut être un ou des fichiers individuels qui existent dans le référentiel et qui, lorsqu'ils sont extraits sur un système de fichiers insensible à la casse, se chevauchent. Par exemple:
Il peut y avoir d'autres situations similaires qui pourraient causer de tels problèmes.
git sur les systèmes de fichiers insensibles à la casse devrait vraiment détecter cette situation et afficher un message d'avertissement utile, mais ce n'est pas le cas actuellement (cela pourrait changer à l'avenir - voir cette discussion et les correctifs proposés sur la liste de diffusion git.git).
Solution
La solution consiste à aligner la casse des fichiers dans l'index git et la casse sur le système de fichiers Windows. Cela peut être fait sous Linux qui montrera le vrai état des choses, OU sous Windows avec l'utilitaire open source très utile Git-Unite . Git-Unite appliquera les modifications de cas nécessaires à l'index git, qui pourra ensuite être validé dans le dépôt.
(1) Cela était probablement dû à une personne utilisant Windows, sans aucune
.gitattributes
définition du fichier en question, et utilisant le paramètre global par défautcore.autocrlf
qui estfalse
(voir (2)).(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
la source
Si les autres réponses ne fonctionnent pas, essayez d'ajouter les fichiers, puis réinitialisez
Dans mon cas, cela a aidé quand il y avait un tas de fichiers vides que git suivait.
la source
$ git add .
place de$ git add -A
Une autre cause à cela pourrait être les systèmes de fichiers insensibles à la casse . Si vous avez plusieurs dossiers dans votre référentiel au même niveau dont les noms ne diffèrent que par cas, vous serez frappé par cela. Parcourez le référentiel source à l'aide de son interface Web (par exemple GitHub ou VSTS) pour vous en assurer.
Pour plus d'informations: https://stackoverflow.com/a/2016426/67824
la source
git ls-tree -r --name-only HEAD | tr A-Z a-z | sort | uniq -d
Vous pouvez
stash
supprimer vos modifications, puis laisser tomber la cachette:la source
Aucune de ces méthodes n'a fonctionné pour moi, la seule solution était de neutraliser l'ensemble du référentiel et de le recloner. Cela inclut le stockage, la réinitialisation, l'ajout puis la réinitialisation, les paramètres clrf, la sensibilité à la casse, etc. Soupir.
la source
Exécuter la commande de nettoyage :
la source
.gitattributes
fichier et les fins de ligne n'étaient pas un problème car je suis sur une boîte Linux et tous les développeurs et notre serveur sont Linux.Vérifiez votre
.gitattributes
.Dans mon cas, je l'ai
*.js text eol=lf
et l'option gitcore.autocrlf
étaittrue
.Cela m'amène à la situation où git convertit automatiquement les fins de ligne de mes fichiers et m'empêche de le réparer et
git reset --hard HEAD
n'a même rien fait.Je le corrige en commentant
*.js text eol=lf
dans mon.gitattributes
et je le commente après.On dirait que c'est juste de la magie.
la source
*.bat text eol=crlf
à mon projet.J'ai rencontré un problème similaire impliquant également
.gitattributes
, mais pour mon cas, il s'agissait du LFS de GitHub. Bien que ce ne soit pas exactement le scénario de l'OP, je pense qu'il fournit une occasion d'illustrer ce que fait le.gitattributes
fichier et pourquoi il peut conduire à des changements non organisés sous la forme de différences "fantômes".Dans mon cas, un fichier était déjà dans mon référentiel, comme depuis le début des temps. Dans un commit récent, j'ai ajouté une nouvelle
git-lfs track
règle en utilisant un modèle qui était rétrospectivement un peu trop large, et finissant par correspondre à cet ancien fichier. Je sais que je ne voulais pas changer ce fichier; Je sais que je n'ai pas modifié le fichier, mais maintenant il était dans mes modifications non programmées et aucune quantité de retraits ou de réinitialisations matérielles sur ce fichier n'allait le réparer. Pourquoi?L'extension GitHub LFS fonctionne principalement en tirant parti des crochets qui
git
permettent d'accéder via le.gitattributes
fichier. Généralement, les entrées dans.gitattributes
spécifient comment les fichiers correspondants doivent être traités. Dans le cas du PO, il s'agissait de normaliser les fins de ligne; dans le mien, il s'agissait de laisser LFS gérer le stockage des fichiers. Dans les deux cas, le fichier quigit
s'affiche lors du calcul d'ungit diff
ne correspond pas au fichier que vous voyez lorsque vous inspectez le fichier. Par conséquent, si vous modifiez la façon dont un fichier est traité via le.gitattributes
modèle qui lui correspond, il apparaîtra comme des modifications non programmées dans le rapport d'état, même s'il n'y a vraiment pas de modification dans le fichier.Cela dit, ma «réponse» à la question est que si le changement de
.gitattributes
fichier est quelque chose que vous vouliez faire, vous devriez vraiment simplement ajouter les changements et continuer. Sinon, modifiez le.gitattributes
pour mieux représenter ce que vous voulez faire.Références
Spécification GitHub LFS - Grande description de la façon dont ils se connectent aux appels de fonction
clean
etsmudge
pour remplacer votre fichier dans lesgit
objets par un simple fichier texte avec un hachage.gitattributes Documentation - Tous les détails sur ce qui est disponible pour personnaliser la façon dont
git
traite vos documents.la source
J'ai eu le même problème. Je l'ai fait,
git reset --hard HEAD
mais chaque fois que je l'ai fait,git status
je voyais certains fichiers modifiés.Ma solution était relativement simple. Je viens de fermer mon IDE (ici c'était Xcode) et de fermer ma ligne de commande (ici c'était un terminal sur mon Mac OS) et je l'ai réessayé et cela a fonctionné.
Pourtant, je n'ai jamais pu trouver l'origine du problème.
la source
Je crois qu'il y a un problème avec git pour Windows où git écrit au hasard les mauvaises fins de ligne lors du paiement et la seule solution consiste à extraire une autre branche et à forcer git à ignorer les modifications. Vérifiez ensuite la branche sur laquelle vous souhaitez réellement travailler.
Sachez que cela annulera toutes les modifications que vous pourriez avoir intentionnellement apportées, donc ne faites cela que si vous rencontrez ce problème immédiatement après le paiement.
Edit: j'aurais peut-être eu de la chance la première fois. Il s'avère que je me suis de nouveau mordu après avoir changé de branche. Il s'est avéré que les fichiers git rapportaient comme modifiés après le changement de branche. (Apparemment, car git n'appliquait pas correctement la fin de la ligne CRLF aux fichiers.)
J'ai mis à jour le dernier git pour Windows et j'espère que le problème a disparu.
la source
Problème similaire, bien que je ne sois sûr qu'en surface. Quoi qu'il en soit, cela peut aider quelqu'un: ce que j'ai fait (FWIW, dans SourceTree): a caché le fichier non engagé, puis a fait une réinitialisation matérielle.
la source
Comme d'autres réponses l'ont souligné, le problème est dû à la correction automatique de fin de ligne. J'ai rencontré ce problème avec les fichiers * .svg. J'ai utilisé le fichier svg pour les icônes dans mon projet.
Pour résoudre ce problème, je préviens git que les fichiers svg doivent être traités comme binaires au lieu de texte en ajoutant la ligne ci-dessous à .gitattributes
* .svg binaire
la source
Dans une situation similaire. À la suite de nombreuses années de tourments avec de nombreux programmeurs qui ont pu bourrer différents encodages des fins de lignes (. Asp , .js, .css ... pas l'essentiel) dans un seul fichier. Il y a quelque temps a refusé .gitattributes. Paramètres de repo gauche
autorclf = true
etsafecrlf = warn
.Le dernier problème est survenu lors de la synchronisation à partir de l'archive avec différentes extrémités de lignes. Après avoir copié à partir de l'archive, dans l'état git, de nombreux fichiers sont modifiés avec la note
The line will have its original line endings in your working directory. warning: LF will be replaced by CRLF in ...
Conseils de Comment normaliser les fins de ligne d'arbre de travail dans Git? aidé
git add -u
la source
Une autre possibilité que j'ai rencontrée était que l'un des packages du référentiel se soit retrouvé avec une HEAD détachée. Si aucune des réponses ici n'aide et que vous rencontrez un message d'état git comme celui-ci, vous pourriez avoir le même problème:
Entrer dans le
path/to/package
dossier agit status
devrait donner le résultat suivant:Et la commande suivante devrait alors résoudre le problème, où
master
devrait être remplacé par votre branche locale:Et vous obtiendrez un message indiquant que votre branche locale aura un certain nombre de validations derrière la branche distante.
git pull
et vous devriez être hors des bois!la source
Pour certaines raisons
git add .
n'a pas fonctionné , mais
$ git add -A
élaboré!
la source