Comment forcer git à extraire la branche principale et à supprimer les retours chariot après avoir normalisé les fichiers à l'aide de l'attribut «text»?

101

D'accord, j'ai donc ajouté le fichier .gitattributesavec des lignes comme celle-ci

*.css text
*.js text
etc...

J'ai ensuite suivi les instructions sur http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

Mais maintenant, ma copie de travail a toujours les retours chariot! J'ai des fichiers non suivis que je souhaite conserver. Comment faire pour que git récupère à nouveau la branche master avec les fichiers normalisés?

Je sais que les fichiers sont normalisés dans le référentiel car lorsque je clone le référentiel, j'ai tous les fichiers sans les retours chariot.

Jason
la source

Réponses:

264

Ah ah! Extrayez le commit précédent, puis extrayez le maître.

git checkout HEAD^
git checkout -f master
Jason
la source
5
Merci pour cette solution de contournement, mais c'est un problème flagrant dans git que "checkout -f" ne force pas vraiment une nouvelle vérification. Un autre problème serait de supprimer d'abord tous les fichiers de copie de travail (c'est-à-dire tout sauf le répertoire .git).
pfalcon
Ah, oui, merci pour ça! En entendant cela, je suppose que nous pourrions simplement supprimer les fichiers d'intérêt et exécuter l'extraction. Pour moi, il n'y avait en fait qu'un seul fichier que j'essayais de corriger. Mais bien sûr, il peut s'agir de tous les fichiers, de centaines ou de milliers.
Jason
Cela échoue sur git 1.8.3 (mac) avec: error: pathspec 'HEAD ^' ne correspond à aucun fichier connu de git.
dval
@dval, regardez les modifications apportées à cet article et vous verrez une autre façon de le faire. Je fonctionne aussi sur un Mac, et cela a fonctionné pour moi. Je vous encourage également à mettre à jour votre git vers 2+ et vous pouvez utiliser Homebrew pour le faire de manière sécurisée et maintenable.
Jason le
2
Cela ne fonctionne pas vraiment. GIT ne mettra à jour que les fichiers qui ont changé entre les deux commits (à quelques exceptions près). Si un référentiel est tout neuf, par exemple. seulement deux commits et le premier est vide, alors cette solution fonctionnera. Sinon, vous devez supprimer de force tous les fichiers comme décrit par la réponse de mechsin.
jstine
16

Comme d'autres l'ont souligné, il suffit de supprimer tous les fichiers du dépôt, puis de les extraire. Je préfère cette méthode et cela peut être fait avec le code ci-dessous

git ls-files -z | xargs -0 rm
git checkout -- .

ou une ligne

git ls-files -z | xargs -0 rm ; git checkout -- .

Je l'utilise tout le temps et je n'ai pas encore trouvé d'inconvénients!

Pour plus d'explications, le -zajoute un caractère nul à la fin de chaque entrée sortie par ls-files, et le -0dit xargsde délimiter la sortie qu'il recevait par ces caractères nuls.

mechsin
la source