2009-07-29 5 views
8

Cela peut être plus approprié en tant que problème dans le tracker/forum utilisé par Git, mais je pensais obtenir une confirmation/explication SO:Est-ce que Git traite l'ajout/le retrait comme un changement de nom?

J'ai un repo suivi un tas d'exécutables d'installateur. Disons que foo-1.0.exe est déjà dans le repo.

Maintenant, j'ajoute foo-2.0.exe dans le même répertoire (git add foo-2.0.exe). Ensuite, je supprime foo-1.0.exe (git rm foo-1.0.exe).

Je m'attends à ce que le statut Git me montre un fichier ajouté et un fichier supprimé. Au lieu de cela, je reçois ceci:


branche maître
changements à engager:
(utilisation "reset git HEAD ..." à désindexer)
renommé: foo-1.0.exe - > foo2.0.exe

C'est une WTF pour moi ... est Git en utilisant une sorte de heuristique pour deviner que 2.0 est une mise à jour 1.0 ... Je peux voir comment cela pourrait donner un sens, mais je Je ne pense pas que je veuille le faire dans ce cas.

+1

btw, j'utilise le contrôle de version uniquement pour le code source. aussi longtemps que vous avez un bon build-systèmes les exécutables doivent être reproductibles – yairchu

+0

Ha ha. Oui, je sais - c'est comme ça que ça doit être fait. Vos fantaisies en un clic ne sont pas les bienvenues autour de ces parties - donnez-nous une dizaine d'années. (plus quelques-uns des programmes d'installation sont des applications tierces) – fakeleft

Répondre

15

Vous avez raison de dire que Git utilise une heuristique. Git suit uniquement le contenu, donc le référentiel sait seulement qu'il y avait un foo-1.0.exe et maintenant il y a un foo-2.0.exe. Dans votre cas, git status utilise les informations disponibles pour devinez qu'il y aurait eu un changement de nom (plus quelques modifications mineures, vos deux fichiers sont probablement assez similaires). Cette supposition n'affecte pas ce qui est enregistré dans le référentiel. Cette philosophie de suivi uniquement du contenu et non des deltas permet à Git d'évoluer et de fournir des outils de meilleure qualité pour la navigation dans l'historique du référentiel. Finalement, Git fournira un moyen de suivre l'évolution d'un morceau particulier de code, au niveau de la fonction ou même de la ligne, à travers les renames ou le refactoring ou toute autre modification de code. Cela peut être fait sans que le référentiel ait à stocker cette information au préalable.

+0

Vous avez probablement configuré Git pour détecter automatiquement les renames ('diff.renames'). –

+0

@Jakub - si cela fonctionne comme prévu, vous pouvez vouloir votre commentaire comme réponse afin que je puisse l'accepter. Je vais le tester bientôt. Greg, merci pour l'aperçu général. – fakeleft

+0

Ouais ... eh bien ... dans mon cas, git est complètement faux et il aurait été bon de savoir comment empêcher une telle chose de se produire. –

Questions connexes